Android加载大位图之压缩图片像素和质量参数

android中的大图片一般都要经过压缩才显示,不然容易发生oom,一般我们压缩的时候都只关注其尺寸方面的大小,其实除了尺寸之外,影响一个图片占用空间的还有其色彩细节。

打开Android.graphics.Bitmap类里有一个内部类Bitmap.Config类,在Bitmap类里createBitmap(intwidth, int height, Bitmap.Config config)方法里会用到,打开个这个类一看
枚举变量

public static final Bitmap.Config ALPHA_8;
public static final Bitmap.Config ARGB_4444;
public static final Bitmap.Config ARGB_8888;
public static final Bitmap.Config RGB_565;

ALPHA_8, ARGB_4444,ARGB_8888,RGB_565 到底是什么呢?

其实这都是色彩的存储方法:我们知道ARGB指的是一种色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue,其实所有的可见色都是右红绿蓝组成的,所以红绿蓝又称为三原色,每个原色都存储着所表示颜色的信息值

ALPHA_8:Alpha由8位组成
ARGB_4444:由4个4位组成即16位,
ARGB_8888:由4个8位组成即32位,
RGB_565:R为5位,G为6位,B为5位共16位

由此可见:

ALPHA_8 代表8位Alpha位图
ARGB_4444 代表16位ARGB位图
ARGB_8888 代表32位ARGB位图
RGB_565 代表8位RGB位图

位图位数越高代表其可以存储的颜色信息越多,当然图像也就越逼真。

用法:

在压缩之前将option的值设置一下:

options.inPreferredConfig = Bitmap.Config.RGB_565;

加载大位图>>方法:像素缩放和图片质量缩放


获取屏幕宽高

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DisplayMetrics displayMetric = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetric);// 获取屏幕宽高度
        Bitmap bitmap = decodeBitmap(displayMetric.widthPixels,
                displayMetric.heightPixels, 这里传入一个图片的byte数组);// 按照屏幕的宽高度进行压缩

    }

压缩图片的方法

    /** 压缩图片
     * 
     * @param width
     *            期望的宽度
     * @param height
     *            期望的高度
     * @param bytes
     *            原始图片的byte数组
     * @return 压缩后的位图
     */
    private Bitmap decodeBitmap(int width, int height, byte[] bytes) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;// 进入只编码模式,只获取元数据,不真正加载整个图片
        BitmapFactory.decodeByteArray(bs, 0, bs.length, options);// 得到元数据
        int outHeight = options.outHeight;// 获取到图片的高度
        int outWidth = options.outWidth;// 获取到图片的宽度
        /** 进行压缩,按照宽高度比例压缩 */
        // int heightScale = (outHeight + height - 1) / height;
        // int widthScale = (outWidth + width - 1) / width;
        /** 自定义标准,0.4以内视为0 超过0.4视为1? */
        int heightScale = (int) (outHeight * 1.0 / height + 0.6f);// 高度的缩放比例值
        int widthScale = (int) (outWidth * 1.0 / width + 0.6f);// 宽度的缩放比例值
        int realScale = heightScale > widthScale ? heightScale : widthScale;// 计算出真正的缩放比例

        options.inPreferredConfig = Bitmap.Config.RGB_565;// 设置图片的质量
        if (realScale > 1) {// 如果缩放比例大于1,就缩放
            options.inSampleSize = realScale;// 设置缩放比例
        }
        // 重新生成图片
        options.inJustDecodeBounds = false;// 退出仅编码格式
        Bitmap decodeResource = BitmapFactory.decodeByteArray(bs, 0, bs.length,
                options);// 重新生成图片
        return decodeResource;// 返回缩放的图片
    }

引用资料:图片质量参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值