安卓Bitmap优化之图片尺寸缩放,透明度

安卓加载一张图片的大小并不是你到资源文件图片大小,比如下图我保存在资源文件图片17.93kb,但是代码直接加载图片,图片占空间为300ky明显比资源图片大很多

//加载图片代码

private ImageView iv, iv2;
private Bitmap bitmap, bitmap2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    iv = (ImageView) findViewById(R.id.iv);
    iv2 = (ImageView) findViewById(R.id.iv2);
    
    //没有处理的图片
    bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ti);
    i(bitmap);
    iv.setImageBitmap(bitmap);

}

//打印
void i(Bitmap bitmap) {
    Log.e("jett", "---------图片" + bitmap.getWidth() + "X" + bitmap.getHeight() + " 内存大小:" + bitmap.getByteCount());
}

 

 

//我个人理解是安卓系统对存放不同资源文件夹的图片回根据需要显示的大小对图片做处理,图片实际占内存大小由图片的宽*高*一个像素点占的字节内存(一个像内存又跟图片编码格式有关,比如RGB_565比ARGB_888占内存小很多)

通过修改需要加载的bitmap大小和透明度属性就可以实现图片内存优化

//下面封装了工具类

**
 * Created by Administrator on 2019/5/9.
 * 图片尺寸缩放 透明度 修改优化工具
 */

public class MyImageSize {
    public static Bitmap setBitmapSize(WeakReference<Context> reference, int id, int w, int h, boolean isAlpha) {
        Resources resources = reference.get().getResources();
        BitmapFactory.Options opts = new BitmapFactory.Options();//获取自定义参数对象
        opts.inJustDecodeBounds = true;//设置只是解密(减少占用图片内存)只是修改图片属性
        //修复图片参数(给的是图片地址,修改图片参数先要调用可以修改参数的方法decodeResource()第三参数就是修改参数的对象)
        //执行 BitmapFactory.decodeResource()方法 设置的opts属性才生效
        BitmapFactory.decodeResource(resources, id, opts);
        /**
         * 修改参数
         */
        //先获取加载图片的宽高
        int outWidth = opts.outWidth;
        int outHeight = opts.outHeight;

        //设置缩放图片的系数(int类型)
        opts.inSampleSize = getSampleSize(outWidth, outHeight, w, h);

        //设置是否需要透明度//安卓默认透明度未
        if (!isAlpha) {
            opts.inPreferredConfig = Bitmap.Config.RGB_565;
        }

        //注意前面设置只获取图片信息,这里要设置回获取图片
        opts.inJustDecodeBounds=false;
        return BitmapFactory.decodeResource(resources, id, opts);
    }

//计算图片实际宽高 是 传入宽高值的 最小整数倍数
    private static int getSampleSize(int outWidth, int outHeight, int w, int h) {
        int sizer = 1;
        if (outWidth > w && outHeight > h) {
            sizer = 2;
            while (outWidth / sizer > w && outHeight / sizer > h) {
                sizer *= 2;
            }
        }

        sizer /= 2;
        return sizer;
    }
}

//优化后执行代码图(图片占用内存由300kb变为3kb减少100倍,图片显示效果肉眼看没区别)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值