- 读取位图的尺寸和类型
在获取bitmap对象前,先将inJustDecodeBounds设置为true,获取图片的基本信息(outWidth、outHeight和outMimeType),为了避免出现OutOfMemory,请先检查位图的尺寸,然后在对其进行编码,除非你绝对信任该来源可为您提供大小可预测的原始数据,以轻松适用可用的内存。 - 将按比例缩小的版本加载到内存中
考虑点:
(1)估计加载完整图片的内存占用大小;
(2)ImageView的大小尺寸;
(3)当前设备的屏幕大小和密度。
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 halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) >= reqHeight
&& (halfWidth / inSampleSize) >= reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
优化方式:
- 质量压缩优化:
使用Bitmap自带的compress(CompressFormat format, int quality, OutputStream stream)里的参数quality,这个参数的值为0~100。
一个图片的像素 = 图片宽度 × 图片长度。
一张图片(BitMap)占用的内存 = 图片宽度 × 图片长度 × 单位像素占用的字节数。
Bitmap.Config中有Bitmap.Config.ALPHA_8、Bitmap.Config.RGB_565、Bitmap.Config.ARGB_4444、Bitmap.Config.ARGB_8888有四个枚举变量。
Bitmap.Config.ALPHA_8表示:每个像素占8位,没有色彩,只有透明度A-8,共8位。
Bitmap.Config.ARGB_4444表示:每个像素占16位,A-4,R-4,G-4,B-4,共4+4+4+4=16位。
Bitmap.Config.RGB_565表示:每个像素占16位,没有透明度,R-5,G-6,B-5,共5+6+5=16位。
Bitmap.Config.ARGB_8888表示:每个像素占32位,A-8,R-8,G-8,B-8,共8+8+8+8=32位。
位数越高,那么可存储的颜色信息越多,图像也就越逼真。 - 尺寸压缩优化
尺寸压缩主要是通过改变图片像素来达到减少图片占用内存的大小。这里我们一般会创建一个空的bitmap,这个空的bitmap的宽和高都是通过比例压缩后的宽和高。然后,通过Canvas将原bitmap画到新的Bitmap上,而由于宽和高都是经过比例缩放后的值,所以,也就减小了Bitmap实际占用的内存大小。 - 采样率压缩优化
采样率压缩主要是使用BitmapFactory.options的inSampleSize来做的。这个其实有点类似于尺寸压缩,都是通过缩小图片的宽和高来减少像素达到减少内存占用和减少本地存储占用。但有点区别的是,尺寸可以针对宽和高分别进行设置缩放比例,而采样率压缩是对宽和高同时做等比例缩放。
网友评论