Android图片压缩

1.原色
牛顿通过三棱镜折射发现自然光是可以分解的:


image.png

他进一步研究,发现自然界只有三种光不能被分解,即红绿蓝(RGB),


image.png

而其他颜色的光均可由这三种光配制而成,因此将红绿蓝称为原色(三单色)。
2.颜色的表示
艺术界,每种颜色根据颜色的深浅,分为256色(灰度级),计算机中,1bit可以表示两个数(0和1),而:

1byte=8bit,28=256(2的8次方)
计算机中用1byte(8位的bit值)囊括一种原色,世界上所有的颜色均可以由三原色配制而成,例如计算机想表示某种浅黄色,它就用三原色的数值(253,244,175)进行表示:


image.png

于是,每单位面积颜色由:
3×8=24位的bit值组成(3字节)
人们后来又给颜色定义了透明通道(Alpha值),透明程度也分为256级,因此每单位面积的颜色最终使用32位的bit值进行表示(占4个字节)。
这里的“每单位面积”即为一个像素。
计算机也正是通过“存储和拼凑”这样一个个的像素点进行显示图片,例如如下这张手机:
image.png

通过无限放大后:
image.png

手机变得非常模糊,再仔细观察,图片显示的是一个个的正方块,这每一个正方块都是一个像素点。

3.图片的存储:
另外,计算机中有多种关于存储图片的格式(png,jpg,webp...),分别用各自的算法都对照片进行了相应的压缩处理,这样能有效减少图片占用的内存。


image.png

Signature:签名
IHDR:头文件数据
IDAT:数据块
IEND:结束块
图片点击右键查看的信息,为IHDR数据携带的信息。
无损压缩:通过对冗余数据的存储方式进行优化,该方式不会丢失文件内容,压缩率受冗余度的影响,所以压缩率较低;
有损压缩:通过丢失不会对文件造成太大影响的数据来达到压缩效果,所以压缩率较高;
其中png是无损压缩格式图片,jpg是有损压缩格式图片, webp同时提供了提供了无损和有损压缩能力。
因此App中选用png格式的图标作为素材,因为该格式为无损压缩,不会出现锯齿,同时该格式提供了Alpha通道。
4.图片的压缩策略:
Android系统底层基于Linux,每个(常规)App应用运行过程fork出一个单独的进程,分配16/24M的内存空间,因此资源是紧缺的,而App读取图片资源的过程是非常消耗资源,在保证图片视觉不失真前提下缩小体积,对于节省带宽和电池电量十分重要。
加载数据流中关于图片的宽(w)高(h)。
github上有一个开源库做得比较好
Luban
Luban
,它的大致计算过程如下
image.png

1>判断图片比例值,是否处于以下区间内:
[1, 0.5625) 即图片处于 [1:1 ~ 9:16) 比例范围内
[0.5625, 0.5) 即图片处于 [9:16 ~ 1:2) 比例范围内
[0.5, 0) 即图片处于 [1:2 ~ 1:∞) 比例范围内
2>判断图片最长边是否过边界值:
[1, 0.5625) 边界值为:1664 * n(n=1), 4990 * n(n=2), 1280 * pow(2, n-1)(n≥3)
[0.5625, 0.5) 边界值为:1280 * pow(2, n-1)(n≥1)

[0.5, 0) 边界值为:1280 * pow(2, n-1)(n≥1)
3>计算压缩图片实际边长值,
以第2步计算结果为准,超过某个边界值则:width / pow(2, n-1),height/pow(2, n-1)
4>计算压缩图片的实际文件大小,
以第2、3步结果为准,图片比例越大则文件越大。
size = (newW * newH) / (width * height) * m;
[1, 0.5625) 则 width & height 对应 1664,4990,1280 * n(n≥3),m 对应 150,300,300;
[0.5625, 0.5) 则 width = 1440,height = 2560, m = 200;
[0.5, 0) 则 width = 1280,height = 1280 / scale,m = 500;注:scale为比例值
5>判断第4步的size是否过小
[1, 0.5625) 则最小 size 对应 60,60,100
[0.5625, 0.5) 则最小 size 都为 100
[0.5, 0) 则最小 size 都为 100
6>将前面求到的值压缩图片 width, height, size 传入压缩流程,压缩图片直到满足以上数值

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容