一些图片的基础概念
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)