图片资源基础:位图与矢量图区别、常见图片格式、色彩深度与通道概念

做屏幕显示系统这么多年,我见过太多花屏案例了。追根溯源,很多问题都出在图片资源本身。你连图片的“底细”都不清楚,怎么排查花屏?

这一章,咱们就把图片资源的基础打牢。说白了,就是搞清楚三件事:图片是怎么存的、有哪些常见格式、颜色信息是怎么组织的。

位图 vs 矢量图:两种截然不同的世界观

先问个问题:一张照片放大到 800%,为什么会变成马赛克?而一个“A”字放大同样倍数,为什么边缘依然光滑?

这就是位图和矢量图的本质区别。

对比维度 位图(Bitmap) 矢量图(Vector)
存储方式 像素点阵,每个点记录颜色值 数学公式,记录坐标、曲线、填充
放大效果 出现锯齿/马赛克 边缘始终平滑
文件大小 随分辨率增大而暴增 与复杂度相关,与尺寸无关
适用场景 照片、截图、复杂渐变 图标、Logo、字体、插画
常见格式 PNG、JPG、BMP、WebP SVG、AI、EPS、PDF

核心结论:屏幕显示最终都是位图。矢量图在渲染时会被“栅格化”成像素点阵。所以花屏问题,99% 出在位图处理环节。

我个人习惯是:UI 图标用 SVG,背景图用 WebP,截图用 PNG。混着用?我踩过坑——有一次把矢量 Logo 当位图导出,分辨率没设对,在大屏上糊成一团。

常见图片格式:选对格式,少一半坑

你想想看,一个 App 里可能同时出现四五种图片格式。每种格式的“脾气”都不一样。我整理了一张表,方便你对照。

格式 压缩方式 透明度 色彩深度 典型用途 花屏风险点
PNG 无损压缩 支持(Alpha通道) 8/24/32位 图标、截图、UI元素 Alpha通道解析错误
JPG 有损压缩 不支持 24位 照片、复杂图像 压缩过度产生色块
BMP 无压缩 有限支持 1/4/8/16/24/32位 老旧系统、原始数据 文件巨大,内存溢出
WebP 有损/无损均可 支持 24/32位 Web、移动端 解码器兼容性

PNG:透明背景的首选

PNG 支持 Alpha 通道,这是它最大的价值。我在项目中遇到过一个问题:一张带透明区域的 PNG 图标,在某个 Android 版本上显示黑色背景。查了半天,是系统解码器把预乘 Alpha 当成了直通 Alpha 处理。

避坑指南:PNG 有两种 Alpha 处理方式——直通(Straight)和预乘(Premultiplied)。渲染引擎如果搞混了,透明边缘会出现黑边或白边。我曾经因为这个被设计师追着改了三版。

JPG:照片之王,但别碰透明

JPG 用有损压缩,牺牲细节换体积。但注意,它不支持透明度。如果你把带透明区域的图存成 JPG,透明部分会变成白色或黑色——这在深色模式下就是灾难。

BMP:老古董,但有时不得不用

BMP 不压缩,像素数据直接摆在那。做底层驱动调试时,我经常用 BMP 做测试图——因为它“所见即所得”,没有解码干扰。但生产环境?别用。一张 4K 的 BMP 能到 50MB,加载都卡。

WebP:现代选择,但兼容性要留意

WebP 是 Google 推出的格式,压缩率比 PNG 高 26%,比 JPG 高 25-34%。我建议新项目优先用 WebP。但注意,某些老旧系统或浏览器不支持。我在一个嵌入式项目里吃过亏——系统 WebP 解码库有 bug,导致花屏。

色彩深度与通道:像素的颜色到底怎么存的?

花屏的本质,是像素颜色信息被错误解析。要理解这个,得先搞懂色彩深度和通道。

色彩深度:每个像素用多少 bit 表示

色彩深度决定了每个像素能显示多少种颜色。常见的有:

  • 1位:黑白两色。老式单色屏用这个。
  • 8位:256色。早期游戏机、GIF 格式。
  • 16位:65536色。R:5bit + G:6bit + B:5bit。
  • 24位:1677万色。R:8bit + G:8bit + B:8bit。真彩色。
  • 32位:24位颜色 + 8位 Alpha 通道。

注意:色彩深度不匹配是花屏的常见原因。比如系统期望 32 位图,你给了 24 位图,解析时每像素少读 8 个 bit,整张图就“错位”了。我排查过一个案例,就是 24 位 BMP 被当成 32 位读取,画面像被“撕裂”了一样。

通道:颜色的“图层”

每个像素的颜色由多个通道组成。最常见的 RGB 三通道,加上 Alpha 就是四通道。

通道模式 通道数 说明 典型场景
灰度 1 只有一个亮度通道 黑白打印、老式监控
RGB 3 红、绿、蓝各 8bit 绝大多数屏幕显示
RGBA 4 RGB + Alpha 透明度 UI 图标、叠加层
CMYK 4 青、品、黄、黑 印刷领域

这里有个坑:有些系统用 BGRA 顺序(蓝绿红透明度),而不是标准的 RGBA。如果你按 RGBA 解析 BGRA 数据,颜色就全乱了。我调试过一个花屏问题,最后发现是 GPU 驱动和图片解码库的通道顺序不一致。

知识体系总览

下面这张图,把本章的核心知识点串起来了。你可以把它当作排查花屏问题的“地图”。

图片资源基础:知识体系与花屏关联 图片资源基础 位图 vs 矢量图 位图(像素点阵) 矢量图(数学公式) 花屏风险:栅格化参数错误 常见图片格式 PNG JPG BMP WebP 花屏风险:解码器不兼容 色彩深度与通道 色彩深度(bit) 通道(RGBA) 花屏风险:深度/顺序不匹配 花屏排查:从图片资源基础入手 排查花屏时,先问三个问题: 1. 图片是位图还是矢量图?栅格化参数对吗? 2. 图片格式是什么?解码器支持吗? 3. 色彩深度和通道顺序与系统期望一致吗?

小结

这一章的内容,说白了就是三句话:

  • 位图是像素的集合,矢量图是数学的描述。屏幕最终只看位图。
  • 选对格式,PNG 保透明、JPG 省体积、WebP 是现代选择、BMP 留作调试。
  • 色彩深度和通道是花屏的“重灾区”。深度不匹配、通道顺序不对,画面必乱。

嗯,基础打牢了,后面分析花屏案例时,你就能一眼看出问题出在哪个环节。