Android 图片压缩相关

214 阅读2分钟

一些图片的基础概念

Bitmap

Bitmap对象本质是一张图片的内容在手机内存中的表达形式。它将图片的内容看做是由存储数据的有限个像素点组成;每个像素点存储该像素点位置的ARGB值。每个像素点的ARGB值确定下来,这张图片的内容就相应地确定下来了

四种色彩模式

  • ALPHA_8 每个像素占8位
  • RGB_565 每个像素占16位
  • ARGB_4444 每个像素占16位
  • ARGB_8888 每个像素占32位

色深

顾名思义,就是"色彩的深度",指是每一个像素点用多少bit来存储ARGB值,属于图片自身的一种属性。色深可以用来衡量一张图片的色彩处理能力(即色彩丰富程度)。典型的色深是8-bit、16-bit、24-bit和32-bit等。上述的Bitmap.Config参数的值指的就是色深。比如ARGB_8888方式的色深为32位,RGB_565方式的色深是16位。色深是数字图像参数

位深度

是指在记录数字图像的颜色时,计算机实际上是用每个像素需要的二进制数值位数来表示的。当这些数据按照一定的编排方式被记录在计算机中,就构成了一个数字图像的计算机文件。每一个像素在计算机中所使用的这种位数就是“位深度”,位深是物理硬件参数,主要用来存储。

GIF、JPEG、BMP、PNG和WebP等

Bitmap是图片在内存中的表示形式,GIF、JPEG、BMP、PNG和WebP等格式图片是持久化存储后的图片, jpg、png 只是图片的容器。而当图片加载到内存中以显示的时候,应该将磁盘上压缩存储的图片内容完整地展开即为解压缩过程,所以bitmap很大,不能直接存储,在内存中很容易造成OOM。

一张Bitmap所占的内存

width * height * nTargetDensity/inDensity * nTargetDensity/inDensity * 一个像素所占的内存

  • nTargetDensity 设备的dpi
  • inDensity 图片目录的resource等级 xhdpi's density: 320 xxhdpi's density: 480

安卓中常用的图片压缩算法

  • 质量压缩(skia 引擎来对图片进行编码压缩)
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//quality 为0~100,0表示最小体积,100表示最高质量,对应体积也是最大
bitmap.compress(Bitmap.CompressFormat.JPEG, quality , outputStream);
  • 尺寸压缩
val newOpts = BitmapFactory.Options()
newOpts.inSampleSize = be // 根据指定的宽高设置对应的缩放比例
return BitmapFactory.decodeFile(srcPath, newOpts)