iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android 基于Bitmap的四种图片压缩方式
  • 593
分享到

Android 基于Bitmap的四种图片压缩方式

2024-04-02 19:04:59 593人浏览 安东尼
摘要

目录知识点介绍 正文 1、质量压缩 2、采样率压缩 3、缩放法压缩 4、RGB_565 通过改变图片格式来实现压缩 总结 知识点介绍 Android 中图片主要以 Bitmap 的

知识点介绍

Android 中图片主要以 Bitmap 的形式存在,所以压缩图片主要就是减少 Bitmap 的大小。Bitmap 的大小可以通过如下的公式计算得到:size = width * height * 单个像素所占字节数。因此压缩图片通过改变公式中的三个变量即可实现。

单个像素所占空间大小在 Android 中有多种,详见如下

格式 所占空间 说明
Bitmap.Config.ALPHA_8 1B 该种格式表示图片只有透明度没有颜色,1个像素占用8位
Bitmap.Config.ARGB_4444 2B 该种格式表示图片透明通道 A 及颜色 R、G、B 各占用4位,共16位
Bitmap.Config.ARGB_8888 4B 该种格式表示图片透明通道 A 及颜色 R、G、B 各占用8位,共32位
Bitmap.Config.RGB_565 2B 该种格式表示图片没有透明通道,颜色 R、G、B 各占用5、6、6位,共16位

Android 中加载图片默认用的是 ARGB_8888 格式,所以加载一张3000 * 4000 的图片默认占用的空间为 45MB 左右,这个值还是很大的😂

测试代码


fun showBitmapinfo(bitmap: Bitmap){
        Log.d("Tag","压缩后的图片大小:${bitmap.byteCount/1024/1024}MB,宽度:${bitmap.width},高度:${bitmap.height}")
}

结果

正文

接下来介绍四种压缩方式

1、质量压缩

质量压缩主要通过 Bitmap.compress()实现,方法介绍



public boolean compress(CompressFORMat format, int quality, OutputStream stream) {
}

CompressFormat 表示图片压缩格式,Android 源码中包含了五种格式

格式名 解释
CompressFormat.JPEG 压缩为JPEG格式。 quality 0表示压缩为最小大小。 100表示压缩以获得最大视觉质量。
CompressFormat.PNG 压缩为PNG格式。 PNG是无损的,因此quality被忽略。
CompressFormat.WEBP 压缩为WEBP格式。 quality 0表示压缩为最小大小。 100表示压缩以获得最大视觉质量。 从Build.VERSioN_CODES.Q ,值100导致文件采用无损WEBP格式。 否则,文件将为有损WEBP格式
CompressFormat.WEBP_LOSSY 压缩为WEBP有损格式。 quality 0表示压缩为最小大小。 100表示压缩以获得最大视觉质量。
CompressFormat.WEBP_LOSSLESS 压缩为WEBP无损格式。 quality是指投入多少精力进行压缩。 值0表示快速压缩,导致文件大小相对较大。 100表示要花费更多时间进行压缩,从而使文件更小。

测试代码



fun getCompressBitmap(bitmap: Bitmap,quality:Int): Bitmap {
    val baos = ByteArrayOutputStream()
    bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos)
    val byte = baos.toByteArray()
    val ins = ByteArrayInputStream(byte)
    val bm = BitmapFactory.decodeStream(ins)
    ins.close()
    baos.close()
    return bm
}

效果

根据上面的日志,你会看到质量压缩并不能改变图片在内存中的大小,因为质量压缩既不能改变图片分辨率也不能改变图片的单个像素大小。

那么你可能有些疑问:既然不能改变大小,那么还费这么大功夫转化而且图片还失真是为了什么?

答:源码中对于compress方法的解释是,将位图的压缩版本写入指定的输出流。所以应该是对输出流中的字节数有影响

验证


val baos = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos)
val byte = baos.toByteArray()
Log.d("Tag","quality=$quality,byte-size=${byte.size}")

结果真的是对输出流的字节数有影响

2、采样率压缩

BitmapFactory.Options 中有个属性 inSampleSize,系统中采样率压缩就是通过该属性



 public int inSampleSize;

直接上代码


    
    fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {
        val height = options.outHeight
        val width = options.outWidth
        var inSampleSize = 1
        if (height > reqHeight || width > reqWidth) {
            val heightRatio = round(height.toFloat() / reqHeight.toFloat()).toInt()
            val widthRatio = round(width.toFloat() / reqWidth.toFloat()).toInt()
            inSampleSize = if (heightRatio < widthRatio) heightRatio else widthRatio
        }
        return inSampleSize
    }

    
    fun getSmallBitmap(filePath: String,reqWidth: Int,reqHeight: Int): Bitmap {
        val options = BitmapFactory.Options()
        options.inJustDecodeBounds = true //不加载 bitmap 进内存,只获取他的基本信息
        BitmapFactory.decodeFile(filePath, options)
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight)
        options.inJustDecodeBounds = false
        return BitmapFactory.decodeFile(filePath, options)
    }

结果

采样率压缩的方式使用的还是挺多的,因为我们获取到的图片它的尺寸可能很大,但是我们在手机上显示的可能不需要那么大,那我们就将图片缩放成我们需要的大小。

3、缩放法压缩

这种方法主要是依赖 Matrix 矩阵变换的方式对图片进行处理。Matrix 中有很多对图片变换的 api 这里只使用它的缩放功能,其他功能可以自行了解

代码


    
    fun matrixBitmap(bitmap: Bitmap,scale:Float):Bitmap{
        val matrix = Matrix()
        matrix.setScale(scale,scale)
        var bm = Bitmap.createBitmap(bitmap,0,0,bitmap.width,bitmap.height,matrix,true)
        return bm
    }

当设置缩放比为0.5时,图片整体就缩放为原来的1/4

4、RGB_565 通过改变图片格式来实现压缩

系统默认使用的是ARGB_8888的格式,所以我们只要改变这个 options 值就能实现


fun rgb565Bitmap(filePath: String):Bitmap{
        val options = BitmapFactory.Options()
        options.inPreferredConfig = Bitmap.Config.RGB_565
        var bitmap = BitmapFactory.decodeFile(filePath,options)
        return bitmap
}

结果图片变成了原图的一半

总结

对于图片的压缩,首先可以先将图片格式改为 RGB_565,这样图片先减小一半,然后对于图片的显示可以使用采样率压缩或者缩放压缩的方式将图片的分辨率改为我们显示的大小,如果是要将图片上传服务器那么可以使用质量压缩的方式,但是这种方式不支持 png 格式的图片。

以上就是Android 基于Bitmap的四种图片压缩方式的详细内容,更多关于Android Bitmap图片压缩的资料请关注编程网其它相关文章!

--结束END--

本文标题: Android 基于Bitmap的四种图片压缩方式

本文链接: https://www.lsjlt.com/news/125777.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android 基于Bitmap的四种图片压缩方式
    目录知识点介绍 正文 1、质量压缩 2、采样率压缩 3、缩放法压缩 4、RGB_565 通过改变图片格式来实现压缩 总结 知识点介绍 Android 中图片主要以 Bitmap 的...
    99+
    2024-04-02
  • Android三种常见的图片压缩方式
    目录1、质量压缩2、按比例压缩(尺寸压缩、采样率压缩)3、鲁班压缩(推荐)下面就为大家带来3种比较常见的压缩方式 先给出一组数据 原图:width:2976; height:297...
    99+
    2024-04-02
  • Android Bitmap压缩方式分析
    Android Bitmap压缩方式分析在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩);质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手...
    99+
    2023-05-30
    android bitmap 压缩
  • 详解android 通过uri获取bitmap图片并压缩
    详解android 通过uri获取bitmap图片并压缩很多人在调用图库选择图片时会在onActivityResult中用Media.getBitmap来获取返回的图片,如下:Uri mImageCaptureUri = data.getD...
    99+
    2023-05-30
    android uri bitmap
  • Android常见的图片压缩方式有哪些
    小编给大家分享一下Android常见的图片压缩方式有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!先给出一组数据原图:width:2976; height:2976原图实际:--->byte:2299820 Mb...
    99+
    2023-06-15
  • Android图片压缩的实例详解
    Android图片压缩的实例详解在做微信分享的时候,由于分享的缩略图要求不得大于32K,否则不能调起微信,所以总结了一下Android图片的压缩问题,大部分资料都是来自网上各位的分享,自己只是完善或修改了一下,本着继续分享的精神,也方便自己...
    99+
    2023-05-30
    android 图片压缩 roi
  • 基于sqlserver的四种分页方式总结
    第一种:ROW_NUMBER() OVER()方式 select * from (     select *, ROW_NUMBER() OVER(Order by ArtistId ...
    99+
    2024-04-02
  • Android-图片压缩详解:原理、方法与实践
    前言1. 图片压缩的原理2. Android图片压缩的方法2.1 BitmapFactory.Options2.1.1 尺寸压缩2.1.2 质量压缩 2.2 第三方库 3. 实践:Android图片压缩3.1 创建...
    99+
    2023-08-18
    android android studio ide
  • React图片压缩上传统一处理方式
    目录React图片压缩上传统一处理压缩相关代码使用方法React图片压缩工具(可下载)示例核心工具React图片压缩上传统一处理 最近项目需要对上传的图片文件进行压缩后才上传到服务器...
    99+
    2022-11-21
    React图片压缩上传 React图片上传 图片压缩上传处理
  • vue-cli3打包时图片压缩处理方式
    目录vue-cli3打包时图片压缩例如代码如下vue-cli3压缩图片配置安装image-webpack-loader插件在vue.config.js当中进行配置vue-cli3打包...
    99+
    2024-04-02
  • Android Tiny集成图片压缩框架的使用
    为了简化对图片压缩的调用,提供最简洁与合理的api压缩逻辑,对于压缩为Bitmap根据屏幕分辨率动态适配最佳大小,对于压缩为File优化底层libjpeg的压缩,整个图片压缩过程全在压缩线程池中异步压缩,结束后分发回UI线程。支持的压缩类型...
    99+
    2023-05-30
    android 图片 压缩
  • Android应用中实现图片压缩的方法有哪些
    这篇文章将为大家详细讲解有关Android应用中实现图片压缩的方法有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Android图片压缩几种方式总结图片压缩在Android开发中很常见也...
    99+
    2023-05-31
    android roi
  • Android的bitmap图片优化方法是什么
    这篇文章主要讲解了“Android的bitmap图片优化方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android的bitmap图片优化方法是什么”吧!背景Android开发中,...
    99+
    2023-06-25
  • 基于SpringIOC创建对象的四种方式总结
    我们平时创建对象的方式无非就是以下两种: 有参构造 、无参构造 我们来看看在Spring中怎么处理这两种情况 首先我们先创建一个实体类: package com.MLXH.poj...
    99+
    2024-04-02
  • Android图片实现压缩处理的实例代码
    整理文档,搜刮出一个Android图片实现压缩处理的实例代码,稍微整理精简一下做下分享。详解:获取本地图片File文件 获取BitmapFactory.Options对象 计算原始图片 目标图片宽高比 计算输出的图片宽高根据...
    99+
    2023-05-30
    android 图片 压缩
  • Android性能优化之图片大小,尺寸压缩的方法
    这篇文章主要介绍“Android性能优化之图片大小,尺寸压缩的方法”,在日常操作中,相信很多人在Android性能优化之图片大小,尺寸压缩的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android性能...
    99+
    2023-06-30
  • Android 单例模式的四种实现方式
    目录一.饿汉式二.懒汉式三.双重检查加锁方式四.静态内部类方式总结一.饿汉式 public class SingletionStarving { private sta...
    99+
    2024-04-02
  • JS+HTML图片显示Canvas压缩功能的方法
    这篇文章主要介绍了JS+HTML图片显示Canvas压缩功能的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一.选择图片并显示<!...
    99+
    2024-04-02
  • vue-cli3打包时图片压缩处理的方法
    本篇内容介绍了“vue-cli3打包时图片压缩处理的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!vue-cli3打包时图片压缩当我们在...
    99+
    2023-06-29
  • Java图片批量压缩像素的实现方法
    目录图片压缩大法压缩前大小:压缩后大小:具体代码实现:附:利用Graphics类如何进行压缩图像总结图片压缩大法 为了防止用户流量的丢失,即使在5g 即将来临的情况下,压缩算法依旧是...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作