博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android BitMap图片压缩
阅读量:3749 次
发布时间:2019-05-22

本文共 4959 字,大约阅读时间需要 16 分钟。

参考链接:

Bitmap.Config ARGB_4444:每个像素占四位,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位,是2个字节

Bitmap.Config ARGB_8888:每个像素占四位,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位,是4个字节

Bitmap.Config RGB_565:每个像素占四位,即R=5,G=6,B=5,没有透明度,那么一个像素点占5+6+5=16位,是2个字节

Bitmap.Config ALPHA_8:每个像素占八位,只有透明度,没有颜色。是1个字节

一般情况下我们都是使用的ARGB_8888,由此可知它是最占内存的,因为一个像素占32位,8位=1字节,所以一个像素占4字节的内存。假设有一张480x800的图片,如果格式为ARGB_8888,那么将会占用1500KB的内存。

480 * 800 * 32 / 8 / 1024 = 1500KB

得到一张BitMap内存方法

public static int getSizeInBytes(@Nullable Bitmap bitmap) {        if (bitmap == null) {            return 0;        }        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {            try {                return bitmap.getAllocationByteCount();            } catch (NullPointerException npe) {            }        }        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) {            return bitmap.getByteCount();        }        return bitmap.getWidth() * bitmap.getRowBytes();    }

质量压缩

public static Bitmap quality(Bitmap bit, int i) {        ByteArrayOutputStream baos = new ByteArrayOutputStream();        bit.compress(Bitmap.CompressFormat.JPEG, i, baos);        byte[] bytes = baos.toByteArray();        return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);    }

这里写图片描述

压缩前和压缩后BitMap里所占的内存并没有发生变化,但是bytes里面的字节数量却随着i的值变化而变化。
适合去传递二进制的图片数据。
网上说这种压缩是在保持像素的前提下改变图片的位深及透明度等。
这里写图片描述
我发现这么压缩完之后效果很差啊,apk后面的透明色都没有了。
如果你的jpg没有透明色,效果会好一些。
该方法对png图片无效。

RGB_565

这种方式压缩,内存变为原来的一半

毕竟RGB_565占用字节是ARGB_8888一半

public static byte[] bitmap2Bytes(Bitmap bm) {        ByteArrayOutputStream baos = new ByteArrayOutputStream();        bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);        return baos.toByteArray();    }public static Bitmap RGB_565(Bitmap bitmap) {        byte[] bytes = bitmap2Bytes(bitmap);        System.out.println("XXX压缩前byte.length " + bytes.length);        BitmapFactory.Options options2 = new BitmapFactory.Options();        options2.inPreferredConfig = Bitmap.Config.RGB_565;        Bitmap bitmap1 = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options2);        byte[] bytes1 = bitmap2Bytes(bitmap1);        System.out.println("XXX压缩后byte.length " + bytes1.length);        return bitmap1;    }

这里写图片描述

虽然也是没有透明背景色,但是其他颜色要比上面清晰。

08-17 16:57:05.191 19512-19512/com.example.test I/System.out: XXX压缩前byte.length 310068308-17 16:57:05.740 19512-19512/com.example.test I/System.out: XXX压缩后byte.length 318695708-17 16:57:05.741 19512-19512/com.example.test I/System.out: XXX 压缩前内存 12582912 宽度 = 2048 高度 = 1536    XXX 压缩后内存 6291456 宽度 = 2048 高度 = 1536

如果不需要 alpha 通道,特别是资源本身为 jpg 格式的情况下,用这个格式比较理想。

该方法对png图片无效。

取样压缩

public static Bitmap inSampleSize(String str) {        BitmapFactory.Options options = new BitmapFactory.Options();        options.inSampleSize = 2;        Bitmap bitmap = BitmapFactory.decodeFile(str, options);        byte[] bytes = bitmap2Bytes(bitmap);        System.out.println("XXX压缩后byte.length " + bytes.length);        return bitmap;    }
08-17 17:14:57.513 31365-31365/com.example.test I/System.out: XXX压缩前byte.length 310068308-17 17:14:57.860 31365-31365/com.example.test I/System.out: XXX压缩后byte.length 782526    XXX 压缩前内存 12582912 宽度 = 2048 高度 = 1536    XXX 压缩后内存 3145728 宽度 = 1024 高度 = 768

宽度和高度都变为原来一半了

该方法对png图片有效。

08-17 17:18:39.669 3366-3366/com.example.test I/System.out: XXX压缩前byte.length 69853108-17 17:18:39.960 3366-3366/com.example.test I/System.out: XXX压缩后byte.length 24382208-17 17:18:39.961 3366-3366/com.example.test I/System.out: XXX 压缩前内存 2476500 宽度 = 975 高度 = 635    XXX 压缩后内存 617516 宽度 = 487 高度 = 317

缩放压缩

public static Bitmap matrix(Bitmap bit) {        Matrix matrix = new Matrix();        matrix.setScale(0.5f, 0.5f);        Bitmap bitmap = Bitmap.createBitmap(bit, 0, 0, bit.getWidth(),                bit.getHeight(), matrix, true);        byte[] bytes = bitmap2Bytes(bitmap);        System.out.println("XXX压缩后byte.length " + bytes.length);        return bitmap;    }
08-17 17:23:06.722 6404-6404/com.example.test I/System.out: XXX压缩前byte.length 310068308-17 17:23:06.830 6404-6404/com.example.test I/System.out: XXX压缩后byte.length 784062    XXX 压缩前内存 12582912 宽度 = 2048 高度 = 1536    XXX 压缩后内存 3145728 宽度 = 1024 高度 = 768

宽度和高度都变为原来一半了,内存也变小了

该方法对png图片有效。

08-17 17:24:48.502 7892-7892/com.example.test I/System.out: XXX压缩前byte.length 69853108-17 17:24:48.812 7892-7892/com.example.test I/System.out: XXX压缩后byte.length 235920    XXX 压缩前内存 2476500 宽度 = 975 高度 = 635    XXX 压缩后内存 620736 宽度 = 488 高度 = 318

通过createScaledBitmap

设置成期待的大小

08-17 17:28:00.315 9970-9970/com.example.test I/System.out: XXX压缩前byte.length 310068308-17 17:28:00.322 9970-9970/com.example.test I/System.out: XXX压缩后byte.length 26350    XXX 压缩前内存 12582912 宽度 = 2048 高度 = 1536    XXX 压缩后内存 90000 宽度 = 150 高度 = 150

该方法对png图片有效。

08-17 17:29:03.807 10720-10720/com.example.test I/System.out: XXX压缩前byte.length 69853108-17 17:29:03.840 10720-10720/com.example.test I/System.out: XXX压缩后byte.length 45520    XXX 压缩前内存 2476500 宽度 = 975 高度 = 635    XXX 压缩后内存 90000 宽度 = 150 高度 = 150
你可能感兴趣的文章
算法训练 K好数
查看>>
2021北京交通大学计算机专硕初试经验分享
查看>>
2021北京交通大学计算机专硕复试经验分享
查看>>
简单实现一个数组、链表
查看>>
关于从其他程序切回word文档时卡顿问题的解决办法
查看>>
Linux安装Java环境
查看>>
Java集合 ArrayList原理
查看>>
Git的基本操作
查看>>
简述128陷阱
查看>>
spring boot中thymeleaf配置说明
查看>>
在spring boot项目中修改包名要注意的一些问题
查看>>
编写类实现从后台向前台返回所要求的数据
查看>>
spring boot的学习(1.创建一个初始的spring boot项目)
查看>>
Python的入门学习
查看>>
⑤mpvue 小程序框架 :初始化项目 分析项目结构
查看>>
⑦mpvue Flyio实现前后台交互
查看>>
⑫HTML5与之前HTML的区别
查看>>
操作系统:Java模拟CPU调度算法(非抢占短进程优先、可抢占优先权调度、多级反馈队列调度)
查看>>
【前端】在页面中还原英雄联盟客户端?
查看>>
【前端】HTML+CSS 纯干货 基础知识分享!
查看>>