【安卓学习积累】Android Bitmap压缩图片

本文主要介绍如何使用Bitmap压缩高清图片。

如果我们使用Bitmap加载高清图片很容易造成OOM,同时在很多时候,我们可以对这种高清图片进行压缩。主要使用到的是BitmapFactory.Options。

一、代码段

BitmapFactory.Options options = getBitmapFactory(R.drawable.ceshi, 500, 400);
img.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ceshi, options));


public BitmapFactory.Options getBitmapFactory(int id, int pixelW, int pixelH){
            BitmapFactory.Options options = new BitmapFactory.Options();

            //inJustDecodeBounds为true,不返回bitmap,只返回这个bitmap的尺寸
            options.inJustDecodeBounds = true;
            //设置图片色彩
            options.inPreferredConfig = Bitmap.Config.RGB_565;
            //预加载图片
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), id, options);
            //获取原始图片宽高
            int originalW = options.outWidth;
            int originalH = options.outHeight;
            Log.e("Bitmap", "originalW" + originalW);
            Log.e("Bitmap", "originalH" + originalH);
            //上面设置为true获取bitmap尺寸大小,在这里一定要重新设置为false,否则位图加载不出来
            options.inJustDecodeBounds = false;
            options.inSampleSize = getSampleSize(originalW,originalH,pixelW,pixelH);
            return options;

    }
    /**
     *
     * @param originalW 原图宽
     * @param originalH 原图高
     * @param pixelW 指定图片宽度
     * @param pixelH 指定图片高度
     * @return 返回原图缩放大小
     */
    private int getSampleSize(int originalW, int originalH, int pixelW, int pixelH) {
        int simpleSize = 1;
        if (originalW > originalH && originalW > pixelW) {
            simpleSize = originalW / pixelW;
        }else if (originalH > originalW && originalH > pixelH){
            simpleSize = originalH / pixelH;
        }
        if (simpleSize <= 0) {
            simpleSize = 1;
        }
        Log.e("Bitmap", "simpleSize" + simpleSize);
        return simpleSize;
    }

二、相关参数介绍

1.inJustDecodeBounds

如果将这个值置为true,在解码的时候将不会返回bitmap,只会返回这个bitmap的尺寸。这个属性的目的是,如果你只想知道一个bitmap的尺寸,但又不想将其加载到内存时。这是一个非常有用的属性。

2.inPreferredConfig

这个值是设置色彩模式,默认值是ARGB_8888,在这个模式下,一个像素点占用4bytes空间,一般对透明度不做要求的话,一般采用RGB_565模式,这个模式下一个像素点占用2bytes。(类型主要有ALPHA_8、RGB_565、ARGB_4444、ARGB_8888 A)ARGB_4444失真严重,基本不用。

3.inSampleSize

这个值是一个int,当它小于1的时候,将会被当做1处理,如果大于1,那么就会按照比例(1 / inSampleSize)缩小bitmap的宽和高、降低分辨率,大于1时这个值将会被处置为2的倍数。例如,width=100,height=100,inSampleSize=2,那么就会将bitmap处理为,width=50,height=50,宽高降为1 / 2,像素数降为1 / 4。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值