Open zgq105 opened 5 years ago
Bitmap是位图的意思,又称栅格图或点阵图,是使用像素阵列来表示的图像。像素是位图最小信息单元,存储在图像栅格中。位图图像质量是由单位长度内像素的多少来决定的。单位长度内像素越多,分辨率越高,图像的效果越好。一般描述宽x高。
像素点的色彩一般用ARGB,其中A表示透明度、R表示红色、G表示绿色、B表示蓝色。查看Bitmap中源码可知,Bitmap.Config是一个枚举类,主要分为以下几种类型:
说明:位数越高,可存储的颜色信息越多,图像也就越逼真。1字节=8位,即1byte=8bit。 因此,一张图片(BitMap)占用的内存=图片宽度×图片长度×单位像素占用的字节数。以一张宽40px,高30px、位图配置为ARGB_4444的图片为例;所以得到40x30x2=2400字节。
指在压缩文件大小的过程中,损失了一部分图片的信息,也即降低了图片的质量,并且这种损失是不可逆的,我们不可能从有一个有损压缩过的图片中恢复出全来的图片。常见的有损压缩手段,是按照一定的算法将临近的像素点进行合并。
只在压缩文件大小的过程中,图片的质量没有任何损耗。我们任何时候都可以从无损压缩过的图片中恢复出原来的信息。 谷歌开源图片压缩算法:https://github.com/google/guetzli
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { // 源图片的高度和宽度 final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { // 计算出实际宽高和目标宽高的比率 final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); // 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高 // 一定都会大于等于目标的宽和高。 inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; }
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { // 第一次解析将inJustDecodeBounds设置为true,来获取图片大小 final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); // 调用上面定义的方法计算inSampleSize值 options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // 使用获取到的inSampleSize值再次解析图片 options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(res, resId, options); }
位图Bitmap是我们开发中使用非常多的,同时也是比较容易造成内存问题的,因此,使用的过程中需要考虑优化和防止内存问题。当然平时开发也可以使用一些开源的框架来管理图片,像glide、picasso等。
1. 什么是Bitmap?
Bitmap是位图的意思,又称栅格图或点阵图,是使用像素阵列来表示的图像。像素是位图最小信息单元,存储在图像栅格中。位图图像质量是由单位长度内像素的多少来决定的。单位长度内像素越多,分辨率越高,图像的效果越好。一般描述宽x高。
2. 如何计算Bitmap所占内存大小
像素点的色彩一般用ARGB,其中A表示透明度、R表示红色、G表示绿色、B表示蓝色。查看Bitmap中源码可知,Bitmap.Config是一个枚举类,主要分为以下几种类型:
说明:位数越高,可存储的颜色信息越多,图像也就越逼真。1字节=8位,即1byte=8bit。 因此,一张图片(BitMap)占用的内存=图片宽度×图片长度×单位像素占用的字节数。以一张宽40px,高30px、位图配置为ARGB_4444的图片为例;所以得到40x30x2=2400字节。
3. 图片压缩
3.1 有损压缩
指在压缩文件大小的过程中,损失了一部分图片的信息,也即降低了图片的质量,并且这种损失是不可逆的,我们不可能从有一个有损压缩过的图片中恢复出全来的图片。常见的有损压缩手段,是按照一定的算法将临近的像素点进行合并。
3.2 无损压缩
只在压缩文件大小的过程中,图片的质量没有任何损耗。我们任何时候都可以从无损压缩过的图片中恢复出原来的信息。 谷歌开源图片压缩算法:https://github.com/google/guetzli
4. 如何避免Bitmap造成OOM
5. 小结
位图Bitmap是我们开发中使用非常多的,同时也是比较容易造成内存问题的,因此,使用的过程中需要考虑优化和防止内存问题。当然平时开发也可以使用一些开源的框架来管理图片,像glide、picasso等。