当前位置:首页>新闻 > 正文

环球今日讯!Android-图片压缩(二)-纯干货

  • 2023-05-03 18:41:34来源:博客园


(相关资料图)

Android - 图片压缩(一)- 项目中取图片转bitmapAndroid - 图片压缩(二)- 纯干货
前言:让我们手撸一个图片压缩库,对压缩工具鲁班进行升级改造。
在平常开发当中,我们一般是使用第三方的工具,不仅快,而且上手简单,基本不用我们动脑子,压缩我们用鲁班压缩,加载图片我们用Glide,这两大工具我想在座的基本上都用吧,不过我们要想提升自己,就要搞清楚深一点的东西,这里我将会带着大家做一款压缩工具,功能媲美鲁班压缩,而且还带有鲁班没有的功能,如输出指定格式等,在这个过程中我们要学会如何获取bitmap,第一篇已经罗列了多种从项目中取图片转bitmap,这里就不多说了。当我们拿到bitmap我们要知道的事情还有很多,比如图片的色彩模式,一个像素点大小,什么是色深,位深等。绝对让你有收获,干货满满,冲呀。
目录1、图片相关概念  1.1 ARGB介绍      1.2 Bitmap概念  1.3 色彩模式  1.4 色深和位深  1.5 内存中Bitmap的大小  1.6 系统一般分配的大小2、图片压缩方式3、压缩的常见方式  3.1、质量压缩  3.2、采样压缩    3.2.1 临近采样(临近点插值算法)    3.2.2 双线性采样(双线性内插值算法)    3.2.3 双线性采样对比邻近采样的优势在于:4、微信和鲁班压缩对比1、图片相关概念1.1 ARGB介绍ARGB颜色模型:最常见的颜色模型,设备相关,四种通道,取值均为[0,255],即转化成二进制位0000 0000 ~ 1111 1111。A:Alpha (透明度) R:Red (红) G:Green (绿) B:Blue (蓝)1.2 Bitmap概念Bitmap对象本质是一张图片的内容在手机内存中的表达形式。它将图片的内容看做是由存储数据的有限个像素点组成;每个像素点存储该像素点位置的ARGB值。每个像素点的ARGB值确定下来,这张图片的内容就相应地确定下来了。1.3 色彩模式Bimap.Config下ALPHA_8 =>8位(1B)RGB_565 =>16位(2B)ARGB_4444 =>16位(2B)ARGB_8888 =>32比特位(4字节,4B)RGBA_F16 =>64位(8B)Bitmap.Config是Bitmap的一个枚举内部类,它表示的就是每个像素点对ARGB通道值的存储方案。取值有以下四种:ALPHA_8:每个像素占8位(1个字节),存储透明度信息,没有颜色信息。RGB_565:没有透明度,R=5,G=6,B=5,,那么一个像素点占5+6+5=16位(2字节),能表示2^16种颜色。ARGB_4444:由4个4位组成,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位 (2字节),能表示2^16种颜色。ARGB_8888:由4个8位组成,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位(4字节),能表示2^24种颜色。
注意:1 byte(字节) = 8bit(位)1 KB = 1024 byte(字节)
1.4 色深和位深色深:每一个像素点用多少bit来存储ARGB值位深:每个像素点在计算机中所使用的二进制数值位数叫做位深度,主要用于存储1.5 内存中Bitmap的大小从网络下载,asset,sd卡取的图片计算公式分辨率 * 每个像素点的大小(如1080*1920*4B = xxx ) (32/8=4)从res内不同资源目录下decodeResource()会经过一次分辨率的转换,再计算大小新分辨率 = 原图横向分辨率 * (设备的 dpi / 目录对应的 dpi ) * 原图纵向分辨率 * (设备的 dpi / 目录对应的 dpi )。1.6 系统一般分配的大小maxMemory() 返回Java虚拟机将尝试使用的最大内存量。如果没有固有的限制,则值为Long。将返回MAX_VALUE。返回:虚拟机将尝试使用的最大内存量,以字节为单位
// 获取应用程序最大可用内存(以字节为单位,/1024/1024=M  华为p20 pro是384M)int maxMemory = (int) Runtime.getRuntime().maxMemory();int cacheSize = maxMemory / 8;  // 设置图片缓存大小为程序最大可用内存的1/8mMemoryCache = new LruCache(cacheSize) {@Overrideprotected int sizeOf(String key, Bitmap bitmap) {return bitmap.getByteCount();}----------------------其他获取方式--------------------ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);//最大分配内存,单位Mint memoryClass = activityManager.getMemoryClass();Log.e("memoryclass=",String.valueOf(memoryClass));//最大分配内存获取方法2float maxMemory = (float) (Runtime.getRuntime().maxMemory() * 1.0/ (1024 * 1024));//当前分配的总内存float totalMemory = (float) (Runtime.getRuntime().totalMemory() * 1.0/ (1024 * 1024));//剩余内存float freeMemory = (float) (Runtime.getRuntime().freeMemory() * 1.0/ (1024 * 1024));Log.e("memoryclass=maxMemory",String.valueOf(maxMemory));Log.e("memoryclass=totalMemory",String.valueOf(totalMemory));Log.e("memoryclass=freeMemory",String.valueOf(freeMemory));
2、图片压缩方式设置图片格式png:无损的压缩图片格式jpeg:有损的压缩图片格式,不能透明设置。webp:同时提供了有损和无损图片格式。无损的格式要比png小26%,有损的比jpeg大25%-30%。质量压缩采样率压缩缩放压缩减少图片的像素,缩略图JNI调用JPEG库
Android目前常用的图片格式有png,jpeg和webp,
png:无损压缩图片格式,支持Alpha通道,Android切图素材多采用此格式jpeg:有损压缩图片格式,不支持背景透明,适用于照片等色彩丰富的大图压缩,不适合logowebp:是一种同时提供了有损压缩和无损压缩的图片格式,派生自视频编码格式VP8,从谷歌官网来看,无损webp平均比png小26%,有损的webp平均比jpeg小25%~34%,无损webp支持Alpha通道,有损webp在一定的条件下同样支持,有损webp在Android4.0(API 14)之后支持,无损和透明在Android4.3(API18)之后支持采用webp能够在保持图片清晰度的情况下,可以有效减小图片所占有的磁盘空间大小
Android中Bitmap所占内存大小计算方式:图片长度 x 图片宽度 x 一个像素点占用的字节数
3、压缩的常见方式质量压缩:降低存储体积(不改变内存中Bitmap的大小)采样压缩:降低图片的尺寸,(当然存储体积和内存占用都会降低)
质量压缩:主要是通过编解码来达到缩小体积。采样压缩:主要是通过采样率,像素点个数等来达到缩小体积
3.1、质量压缩一般用到Bitmap.compress(Bitmap.CompressFormat.JPEG,quality,outputStream)
Bitmap.compress(Bitmap.CompressFormat.JPEG,quality,outputStream)其中Bitmap.CompressFormat.JPEGBitmap.CompressFormat.PNG  无损,无法再质量压缩?Bitmap.CompressFormat.WEBP  可优化30%,比JPEG更加省空间quality:0-100,1最小体积,100 最高质量,体积也是最大outputStream:  ByteArrayOutputStream 一个输出流,压缩后的流,如果要保存成图片文件,就保存此流
3.2、采样压缩临近采样(临近点插值算法)双线性采样(双线性内插值算法)3.2.1 临近采样(临近点插值算法)
使用了BitmapFactory.options  下的inSampleSize:采样压缩系数  如果是2,直接缩放宽高为原先 二分之一 (1/2)该方式比较粗暴,2个像素取一个。宽高都减少了,自然内存也降低了。------------------------------------------------------------------------------    public static void ljCom(InputStream open){        BitmapFactory.Options options = new BitmapFactory.Options();//或者 inDensity 搭配 inTargetDensity 使用,算法和 inSampleSize 一样        options.inSampleSize = 2; //设置图片的缩放比例(宽和高) , google推荐用2的倍数://        Bitmap bitmap = BitmapFactory.decodeFile("app/src/main/assets/wx.png");//        Bitmap compress = BitmapFactory.decodeFile("app/src/main/assets/wx.png", options);        Bitmap mbitmap = BitmapFactory.decodeStream(open, null, options);        Log.e("双线性采样","----压缩后----》"                +"\n内存大小》"+mbitmap.getByteCount()                +"\n宽度》"+mbitmap.getWidth()                +"\n高度》"+mbitmap.getHeight());    }
3.2.2 双线性采样(双线性内插值算法)双线性采样(Bilinear Resampling)在 Android 中的使用方式一般有两种:
Bitmap bitmap = BitmapFactory.decodeFile("xxx.png");Bitmap compress = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth()/2, bitmap.getHeight()/2, true);或者直接使用 matrix 进行缩放Bitmap bitmap = BitmapFactory.decodeFile("xxx.png");Matrix matrix = new Matrix();matrix.setScale(0.5f, 0.5f);bm = Bitmap.createBitmap(bitmap, 0, 0, bit.getWidth(), bit.getHeight(), matrix, true);
看源码可以知道createScaledBitmap函数最终也是使用第二种方式的matrix进行缩放,双线性采样使用的是双线性內插值算法,这个算法不像邻近点插值算法一样,直接粗暴的选择一个像素,而是参考了源像素相应位置周围2x2个点的值,根据相对位置取对应的权重,经过计算之后得到目标图像。双线性内插值算法在图像的缩放处理中具有抗锯齿功能, 是最简单和常见的图像缩放算法,当对相邻2x2个像素点采用双线性內插值算法时,所得表面在邻域处是吻合的,但斜率不吻合,并且双线性内插值算法的平滑作用可能使得图像的细节产生退化,这种现象在上采样时尤其明显。
filter:当进行的不只是平移变换时,filter参数为true可以进行滤波处理,有助于改善新图像质量;flase时,计算机不做过滤处理。
使用方式
/** * 双线性采样 * */public static void sxxCon(Bitmap bitmap){    Log.e("双线性采样","----压缩前----》"            +"\n内存大小》"+bitmap.getByteCount()            +"\n原图宽度》"+bitmap.getWidth()            +"\n原图高度》"+bitmap.getHeight());    //等比例缩放压缩    Bitmap mbitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth()/2, bitmap.getHeight()/2, true);    Log.e("双线性采样","----压缩后----》"            +"\n内存大小》"+mbitmap.getByteCount()            +"\n宽度》"+mbitmap.getWidth()            +"\n高度》"+mbitmap.getHeight());}/** * 双线性采样 * */public static void sxxCon2(Context context,Bitmap bitmap){    Log.e("双线性采样","----压缩前----》"            +"\n内存大小》"+bitmap.getByteCount()            +"\n宽度》"+bitmap.getWidth()            +"\n高度》"+bitmap.getHeight());    Matrix matrix = new Matrix();    matrix.setScale(0.6f, 0.6f);    Bitmap mbitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);    Log.e("双线性采样","----压缩后----》\n"            +"\n内存大小》"+mbitmap.getByteCount()            +"\n宽度》"+mbitmap.getWidth()            +"\n高度》"+mbitmap.getHeight());    saveBitmapAsPng2(context,mbitmap,"aaq");}
3.2.3 双线性采样对比邻近采样的优势在于:它的系数可以是小数,而不一定是整数,在某些压缩限制下,效果尤为明显处理文字比较多的图片在展示效果上的差别,双线性采样效果要更好4、微信和鲁班压缩对比
微信LuBan
1采样率压缩
2进行宽高的等比压缩(微信对原图和缩略图限制了最大长宽或者最小长宽)进行宽高的等比压缩
3对图片的质量进行压缩(一般75或者70)应该说的是quality=75对图片的质量进行压缩
4采用webP的格式

标签:

延伸阅读

推荐阅读

环球今日讯!Android-图片压缩(二)-纯干货

Android-图片压缩(一)-项目中取图片转bitmapAndroid-图片压缩(二)-纯干货前言:让我们手撸一个图片压缩

世界简讯:电解水制氢主流技术实现突破

随着技术的进步,SOEC已开始逐步走向规模化发展,降本路径清晰,有望成为助力实现碳达峰碳中和目标的重要推

水果吃下来的泡沫网套别扔,还能这样做插花→|观焦点

很多水果在销售时有一层泡沫网套的“外衣”,这些泡沫网套往往会被人们随手丢弃。近日,彭浦镇美景雅园居民

天天即时:广交会观察:中华文化催生外贸新增长点

中新社广州5月3日电题:广交会观察:中华文化催生外贸新增长点中新社记者蔡敏婕被誉为丝绸界“软黄金”的香

世界即时:清朝宫女多大才能出宫?会一辈子老死宫中吗?

清朝宫女多大才能出宫?会一辈子老死宫中吗?,清朝最初的时候,秀女和宫女的选拔是混在一起的,虽然是混在

三方贸易是什么意思_贸易是什么意思_新消息

1、■贸易:商品的交易,一般指大宗的交易。2、■贸易条件:出口商品与进口商品的交换比率。3、又称进出口商

广东轻工职业学院死亡事件_广东轻工职业学院

1、经济信息管理就业方向:专业毕业生主要面向企事业、金融、行政机关、科研机构,在其相关的信息管理部门

赵丽娜晒《乘风2023》节目海报:188红太狼报到

直播吧5月3日讯今天,赵丽娜在社媒晒出了自己参加《乘风2023》的节目海报。赵丽娜为海报配文写道:“188红

环球新资讯:河津街舞巅峰赛全国2300名选手参加

比赛现场为期两天的河津市“鱼跃龙门幸福河津”第九届影响力街舞“茂栋杯”巅峰赛暨首届滑板轮滑场地赛日前

《超级棒球4》Steam页面上线 6月3日正式发售

今日(5月3日),EA发行MetalheadSoftware开发的棒球模拟游戏《超级棒球4》Steam页面上线,游戏暂不支持中

南京工业大学是几本是211吗_南京工业大学是几本 每日播报

1、南工大属于二本大学1,南京工业大学答:南京工业大学,是国家首批 "2011计划 "和 "卓越工程师教育培养计

“五一”消费热潮提振中国经济

据美国有线电视新闻网网站5月1日报道,从长城到上海外滩,中国最著名的景点在劳动节假期期间被成群结队的游

【快播报】云南保山市隆阳区发生5.2级地震

证券时报网讯,“云南发布”3日消息,据中国地震台网正式测定,2023年5月2日23时27分在云南保山市隆阳区瓦

Doinb没人要?Doinb深夜吐露心声:已被3支战队接触,拒绝外赛区 全球看点

对此Doinb在深夜吐露了自己的心声:“夏季转会期啊,我不能说很多,但有三支队伍找过我,后面我继续看情况

车胤人物简介_窦线娘的人物简介-天天观热点

1、清代褚人获小说《隋唐演义》小女线娘,年方十三,色艺双绝,好读韬略,闺中时舞一剑,竟若游龙。2、……

菜鸟网络是外包物流吗_菜鸟物流加盟条件 当前快看

1、短期内还没有具体方案,公司才刚刚成立,发展模式还不清晰;因为这是一个社会化分工的巨大工程。2、单靠

农村居民可支配收入是什么意思_居民可支配收入是什么意思-世界时讯

1、居民可支配收入是指居民可用于最终消费支出和储蓄的总和,即居民可用于自由支配的收入,既包括现金收入

世界快播:2023上海车展:i7 M70L体验 1100牛米还带M的宝马电动车

本次宝马展台上最重磅的就是这台BMWi7M70L,这款车是宝马“技术魔法”的集大成者。全球首发定在中国,说明

57岁郭富城秒杀53岁丈母娘,娶小娇妻的他,竟被丈母娘衬托的像个少年郎

港圈的四大天王一直蛮活跃的,尤其是郭富城、刘德华两人,那真是人老心不老,都快要到退休的年纪了,还忙着

为攫取利润 美国企业扩大移民童工雇佣规模

为攫取利润美国企业扩大移民童工雇佣规模

休闲裤叠衣技巧 休闲裤叠衣技巧图解

1、左右对齐叠,右裤筒往右叠,裤头和左裤筒分别往中间靠拢折叠,最后把右裤筒翻过来,套进裤子里。2、左右

安全技术管理就业怎么样与工资与专前景

1、安全技术管理就业怎么样一般来说不适合,一般。其实这个专业前景是不错,但是学的内容很多,比较综合,

当前速读:历史上的12月3日发生了什么(历史上的12月3日发生了什么事)

历史上的12月3日发生的大事有很多,如1818年的12月3日,伊利诺州成为美国第21个州。1904年的12月3日,美国

湖勇大战前瞻:经典的詹库对决回来了 戴维斯能改变系列赛格局?

北京时间5月3日上午,勇士将在主场迎战湖人,开启西部半决赛之旅。时隔5年,斯蒂芬-库里季后赛大战勒布朗-

滚动:深圳有个局长信箱,两年为群众解难题3.2万余个

“您有新的来件,请及时处理”,伴随着一声电脑提示音,刘瑞峰在电脑前熟练地操作起来:签收信件、打开阅读

中外合作研究发现:4.62亿年前威尔士化石保存多种海洋生物

中新网北京5月2日电(记者孙自法)施普林格·自然旗下专业学术期刊《自然-生态与演化》最新发表一篇古生物学

观焦点:港股公路股多数上涨 四川成渝高速公司涨超6%

【港股公路股多数上涨四川成渝高速公司涨超6%】财联社5月2日电,截至发稿,四川成渝高速公司(00107 HK)涨6 4

又到月季时,全市高架道路限时“美妆”等你来打卡! 焦点短讯

醉美魔都,无处不飞花,旖旎春光,但闻花香,你瞧,“花中皇后”月季,正起舞弄姿争相开放!市绿化市容局介

世界今热点:清原县气象局发布大风蓝色预警【Ⅳ级/一般】【2023-05-02】

大风蓝色预警信号:预计2日白天,清原县西南风4到6级,阵风7到8级,请注意出行安全,加固临时搭建物,防范

美媒评本季球员榜:约基奇居首字母哥库里二三 詹皇仅第15引争议|环球报道

北京时间5月2日,美媒TheRinger综合常规赛和季后赛截止目前表现,评选本赛季球员排行榜,约基奇高居首位,

猜您喜欢

    Copyright ©  2015-2022 太平洋服装网版权所有  备案号:豫ICP备2022016495号-17   联系邮箱:93 96 74 66 9@qq.com