3、图像资源压缩策略:使用L8、A4、A2等索引色格式替代RGB565,减少图片在Flash中的体积。
好,咱们直接进入正题。上一章聊了内存池和动态位图,这一章我带你看看更基础、也更立竿见影的一招——图像资源压缩。
说白了,就是让图片在Flash里占的地方更小。你想想看,一个RGB565的图片,每个像素要16位,也就是2个字节。如果换成索引色格式,比如L8,每个像素只要1个字节,直接砍半。要是用A4或者A2,那就更夸张了。
我在项目里见过不少团队,上来就把所有图片扔成RGB565,Flash爆了也不知道从哪下手。其实很多时候,人眼根本分辨不出那点颜色损失。嗯,这里的关键是——选对格式。
3.1 为什么RGB565不是万能的?
RGB565能显示65536种颜色,看起来很美好。但代价是每个像素占2字节。如果你的界面里有很多纯色图标、简单渐变或者文字,用RGB565纯粹是浪费。
举个例子:一个32x32像素的图标,RGB565要2KB。换成L8,只要1KB。如果这个图标只有黑白两色,用A2(每像素2位)更是只要256字节。差距有多大?你自己算算。
核心观点: 图片的视觉复杂度决定了它能被压缩到什么程度。颜色越少、细节越简单,压缩空间越大。
3.2 索引色格式速览
TouchGFX支持几种索引色格式,我列个表给你看,一目了然。
| 格式 | 位深 | 每像素位数 | 调色板大小 | 适用场景 |
|---|---|---|---|---|
| RGB565 | 16位 | 16 | 无 | 照片、复杂渐变 |
| L8 | 8位 | 8 | 256色 | 图标、简单界面、文字 |
| A4 | 4位 | 4 | 16色 | 极简图标、单色图 |
| A2 | 2位 | 2 | 4色 | 黑白图标、文字 |
看到没?从L8到A2,压缩比越来越高。但代价是颜色数量越来越少。你得根据图片内容来选。
3.3 实战:如何把图片转成L8?
我个人习惯用ImageMagick或者GIMP来做预处理。TouchGFX Designer虽然也能设置格式,但有时候它自动转换的效果不一定最好。
这里给个ImageMagick的命令行例子:
# 把一张PNG转成256色的L8格式PNG
magick input.png -colors 256 -depth 8 output_l8.png
# 转成16色的A4格式
magick input.png -colors 16 -depth 4 output_a4.png
# 转成4色的A2格式
magick input.png -colors 4 -depth 2 output_a2.png
转换完之后,再导入TouchGFX Designer,选择对应的格式就行。
小技巧: 转换前先看看图片的实际颜色数。用 magick input.png -unique-colors txt:- | wc -l 可以统计颜色数。如果少于256,那L8基本无损。
3.4 避坑指南:我曾经踩过的雷
我曾经在一个项目里,把所有按钮图标都转成了A4格式。结果在屏幕上显示出来,边缘有严重的锯齿和色块。为什么?因为图标本身有抗锯齿渐变,16种颜色根本不够用。
后来我学乖了:带渐变或半透明的图片,至少用L8。纯色扁平风格的图标,才适合A4或A2。
还有一个坑:调色板对齐。TouchGFX的L8调色板是全局的,如果你在同一个屏幕上用了两张不同调色板的L8图片,切换时可能会有颜色闪烁。解决办法是把它们合并到同一张调色板里。
警告: 不要盲目追求高压缩比。A2格式只适合颜色极少的场景。如果图片颜色数超过4种,强行转A2会严重失真,反而影响用户体验。
3.5 知识体系:如何选择压缩策略?
我画了一张图,帮你理清思路。
这张图的核心逻辑很简单:先看颜色数,再选格式。颜色数越少,压缩比越高。但别忘了,用户体验也是成本。我建议你从L8开始试,如果视觉上没问题,再往A4、A2走。
3.6 实际效果对比
拿一个32x32的图标来算笔账:
| 格式 | 单图大小 | 100张图总大小 | 节省空间 |
|---|---|---|---|
| RGB565 | 2 KB | 200 KB | 基准 |
| L8 | 1 KB | 100 KB | 节省50% |
| A4 | 0.5 KB | 50 KB | 节省75% |
| A2 | 0.25 KB | 25 KB | 节省87.5% |
你看,光是换格式,就能省下大几十KB甚至上百KB的Flash空间。对于资源紧张的嵌入式设备来说,这可不是小数目。
我的建议: 先从界面里占比最大的图片开始试。比如背景图、大图标、按钮。换成L8后,如果肉眼看不出来区别,那就大胆用。如果发现色块或噪点,再退回到RGB565。
好了,这一章的内容就这些。记住一句话:不是所有图片都需要65536种颜色。选对格式,Flash空间自然就省出来了。