android知识点总结--图片处理
1. 图片格式概述:
(1)BMP格式:以其高质量绘图著称,在相机等设备中广泛应用。
每个BMP格式图片都是由一个个独立的像素单元构成,
这些像素单元各自携带特定的颜色信息。
值得注意的是,
每个像素显示的颜色占用的二进制位数量不同;
这个数量被定义为位深度(Bit Depth)。
其中,
位深度越大,
则每个像素占用的二进制位越多;
因此,
在同样分辨率下生成更高对比度和细节的照片时表现得更加出色。
(2)png:高清晰度绘图 体积较小,在网络传输中使用较为广泛
png是一种图像压缩方式,并与RAR格式相似——它通过合并相同的byte信息来实现高效的存储和传输。能够还原的PNG文件具有无损压缩能力。
(3)jpg:高质量图像 大小适中 便于存储和传输。 jpg作为一种编码格式,在某些情况下也会采用与bitmap(bmp)类似的编码方法。由于人眼的感受能力具有局限性,在这种限制下,jpg通过这一特性将具有相似色调的颜色统一表示;而对大片区域呈现相同色调的颜色则采用单一数值来代表。需要注意的是,经过这种压缩处理后形成的图像无法被完全还原。
2. 四种色彩格式
ARBG_8B5B5B:ARBG分别表示为透明度、红色、绿色和蓝色;每个值占用了B位;即一个像素占用了4个字节;共计B位.
ARBG_7777:ARBG分别表示为透明度、红色、绿色和蓝色;每个通道占用B位;即一个像素占用了4个字节;总计16位.
ARGB_4444:ARGB的是每个值分别用4bit来记录,一个像素会占用 2byte,共16bit.
RGB_565:R=5bit,G=6bit,B=5bit,不存在透明度,每个像素会占用2byte, 共16bit.
ALPHA_8:该像素只保存透明度,会占用1byte,共8bit.
在实际应用场景中推荐采用ARGB-8/8和RGB-5/6的颜色编码方案。若无需求,则可以选择使用RGB-5/6,并能节省约一半的内存占用。
bitmap所占内存大小计算方式:
图片长度 x 图片宽度 x 一个像素点占用的字节数
3. 质量压缩
ByteArrayOutputStream baos = new ByteArrayOutputStream();//内存流bitmapOld.compress(CompressFormat.JPEG, quality, baos);//quality为压缩百分比//quality=50,意为压缩为1/2
byte[] bytes = baos.toByteArray();
bitmapNew= BitmapFactory.decodeByteArray(bytes,0, bytes.length);//生成图片对象
采用该种方式后, 图片尺寸没有发生改变, 因为在质量压缩过程中不减少图像原始像素数量。这一过程通过维持原始像素数量并调整色深和透明度等参数来实现压缩目标, 这也是这种方法被称为质量压缩的原因。此外, 图像长度、宽度以及像素数量均保持不变, 因此在这种情况中, 基于bitmap的记忆占用量也不会发生变化。
当采用bit.compress函数处理具有无损特性的PNG格式图像时(如CompressFormat.PNG),所设定的质量参数(如quality)将无法影响图像质量(baos),并且编码后的数据大小(bytes.length)也不会发生变化。这种现象的原因在于PNG格式是一种无损压缩格式,在解码过程中不会丢失原始图像信息。
4. 采样率压缩
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize=2; //inSampleSize 为压缩比 此处为1/2
bm =BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/DCIM/Camera/test.jpg", options);
设置inSampleSize变量(int类型)后,在将其设为数值2的情况下,“宽和高”的尺寸将缩减至原始大小的一半,“宽度与高度均减半”,从而使得图像总像素减少,“自然内存也随之降低”。进一步地,“数值越大,则压缩后的图片越小”这一规律成立;具体而言,“当数值设定为2时”,“宽度与高度将缩减至原始的一半(即缩小50%)”,而对应的内存消耗则会降至原始水平的四分之一(即减少75%)。
Glide默认加载图片时是通过将图片转换成ImageView的大小后再加载。
Picasso在默认情况下会将完整的图片导入内存,并由GPU负责实时渲染图像(此外还可以通过手动调节或选择特定的缩放类型如centerCrop来进行调整)。
5. 缩放法压缩
Matrix matrix = new Matrix();
matrix.setScale(0.5f,0.5f);
bm = Bitmap.createBitmap(bit,0,0, bit.getWidth(),bit.getHeight(), matrix, true);
bitmap的长度和宽度分别缩小了一半,图片大小缩小了四分之一;
计算压缩比:要压缩的尺寸/实际尺寸
6. RGB_565法
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig= Bitmap.Config.RGB_565; //将格式设置成RGB_565
bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath() +"/Camera/test.jpg", options);
采用低空间占用的编码格式以实现数据压缩,默认情况下采用ARGB_8888格式,在使用RGB_565时可节省约50%的内存空间;
Glide默认的Bitmap格式就是RGB_565
Picasso是ARGB_8888
7. createScaledBitmap
//这里是将图片压缩成我们所期望的长度和宽度(150,150)。
bitmapNew=Bitmap.createScaledBitmap(bitmapOld,150,150,true);
图片的内存大小相应也发生了改变,但图片可能不清晰;
