1 调整大小
仅该接口:decodeResource
大小根据车机分辨率和图片对应的文件夹来决定的(drawble=drawblemdpi=1)
scale = (float) targetDensity / density;
Bitmap内存占用 ≈ 像素数据总大小 = 图片宽 x 图片高 x(设备分辨率/资源目录分辨率)² x 每个像素的字节大小
更改Bitmap.Config格式
通过martix进行压缩(改变Bitmap大小)
采样率压缩(改变Bitmap大小)
2 通过复用
缓存通用的Bitmap对象
如果不进行缓存,尽管看到的是同一张图片文件,但是使用BitmapFactory类的方法来实例化出来的Bitmap,是不同的Bitmap对象。缓存可以避免新建多个Bitmap对象,避免内存的浪费
3 不实例化bitmap而获得宽高的值
通用的图片读取工具类:推荐统一用decodestream
BitmapFactory获取Bitmap图片以及解决OOM异常
https://blog.csdn.net/abc6368765/article/details/73800332?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-17-73800332-blog-43058143.235^v43^pc_blog_bottom_relevance_base7&spm=1001.2101.3001.4242.10&utm_relevant_index=20
没有alpha要求的png改为jpg,相当于argb8888 变成rgb565,
--WebP(不支持.9)--》包大小
索引位图:要rgb565且有ahpe通道
try {
Options options = new Options();
options.inPreferredConfig = Config.RGB_565;
Bitmap bitmap = BitmapFactory.decodeStream(getResources().getAssets().open("index.png"), null, options);
Log.d(TAG, "bitmap.getConfig() = " + bitmap.getConfig());
Log.d(TAG, "scaled bitmap.getByteCount() = " + bitmap.getByteCount());
imageView.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
图片复用主要就是指的复用内存块,不需要在重新给这个bitmap申请一块新的内存,避免了一次内存的分配和回收,从而改善了运行效率
options.inMutable=true;
options.inBitmap=reusable;
ecodeFileDescriptor确实比decodeFile节省内存