前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android计算bitmap内存及内存优化

android计算bitmap内存及内存优化

作者头像
用户9854323
发布2022-06-25 10:59:09
5400
发布2022-06-25 10:59:09
举报
文章被收录于专栏:小陈飞砖

参考: https://www.cnblogs.com/dasusu/p/9789389.html http://www.cocoachina.com/articles/30884

计算公式:

1、如果设置了inSampleSize=1,2,4,8 , 则相应的 Sample高度 = 原图高度 * 1,1/2, 1/4, 1/8; Sample宽度 = 原图宽度 * 1,1/2, 1/4, 1/8;

2、(BitmapFactory 中 decodeResource() 方法内部会根据 dpi 进行分辨率的转换,其他 decodeXXX() 就没有了,所以,如果不是decodeResource() 或 图片的来源,如磁盘(assets, raw),文件,流等, 则跳过这步) 新图的高度 = Sample高度 * (设备的 dpi / 目录对应的 dpi ) 新图的宽度 = Sample宽度 * (设备的 dpi / 目录对应的 dpi )

3、 bitmap内存 = 新图的高度 * 新图的宽度 * 每像素大小

参数看下面: 每像素大小根据options中的: Bitmap.Config.ARGB_8888 : 8bit + 8bit + 8bit + 8bit = 32bit = 4Byte Bitmap.Config.ARGB_4444 : 4bit + 4bit + 4bit + 4bit = 16bit = 2Byte Bitmap.Config.RGB_565 : 5bit + 6bit + 5bit = 16bit = 2Byte

原图宽高:

在这里插入图片描述
在这里插入图片描述

6个目录对应dip: L DPI ( Low Density Screen,120 DPI ),0.75 M DPI ( Medium Density Screen, 160 DPI ),1 H DPI ( High Density Screen, 240 DPI ),1.5 XH DPI ( Extra-high density screen, 320 DPI ),2 XXH DPI( xx-high density screen, 480 DPI ),3 XXXH DPI( xxx-high density screen, 640 DPI ),4

代码语言:javascript
复制
   @Override
    public void draw(@NonNull Canvas canvas) {
        try {
            if (mResources != null && mParentViewHeight != 0 && mParentViewWidth != 0) {
                if (mLastBitmap == null) {
                    mLastBitmap = Bitmap.createBitmap(mParentViewWidth, mParentViewHeight, Bitmap.Config.ARGB_4444);
                }

                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds = true;
                BitmapFactory.decodeResource(mResources, RES_IDS[curFrame], options);

                options.inScaled = true;
                options.inDensity = mInDensity;
                options.inTargetDensity = mInTargetDensity;
                options.inJustDecodeBounds = false;
                options.inMutable = true;
                options.inSampleSize = 4;
                options.inBitmap = mLastBitmap;  //bitmap内存复用

                Bitmap bitmap = BitmapFactory.decodeResource(mResources, RES_IDS[curFrame], options);

                int canvasWidth = canvas.getWidth();
                int bitMapHeight = bitmap.getHeight();
                int bitMapWidth = bitmap.getWidth();

                canvas.drawBitmap(bitmap, bitMapWidth,bitMapHeight, mPaint);
                 
                Log.e("chen", "density : " +  mResources.getDisplayMetrics().density);
                Log.e("chen", "byteCount : " + bitmap.getByteCount() + "  AllocationByteCount : " + bitmap.getAllocationByteCount());
}

bitmap.getByteCount() :bitmap使用内存的理论值。 bitmap.getAllocationByteCount() :使用options.inBitmap时,bitmap实际使用的内存。

内存优化: 1、设置inSampleSize 2、不影响用户体验的情况下:Bitmap.Config.ARGB_4444

举例: 1、

在这里插入图片描述
在这里插入图片描述

2、

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档