QImage::Format_Mono
, QImage::Format_RGB32
, QImage::Format_ARGB32
, QImage::Format_ARGB32_Premultiplied
, 和 QImage::Format_RGB555
是 Qt 中不同的图像像素格式,它们在存储方式、颜色深度、是否支持透明通道以及适用场景上各有不同。下面是它们的详细对比:
1. Format_Mono
- 描述:每个像素用 1 位表示,0 表示黑色,1 表示白色。
- 内存占用:1 bit per pixel (BPP)
- 是否支持透明度:否
- 是否使用调色板:否(黑白固定)
- 用途:
- 单色图像(如黑白文档、线条图)
- 节省内存(适合嵌入式或低资源环境)
- 优点:
- 极低内存占用
- 缺点:
- 只能显示黑白两色
2. Format_RGB555
- 描述:每个像素用 16 位表示,RGB 各占 5 位,共 32768 种颜色。
- 内存占用:16 BPP
- 是否支持透明度:否
- 是否使用调色板:否
- 用途:
- 需要彩色但内存有限的场景(如老式图形硬件)
- 游戏开发中早期使用的颜色格式
- 优点:
- 比
RGB32
更节省内存
- 比
- 缺点:
- 色彩质量较低(只有 32K 色)
3. Format_RGB32
- 描述:每个像素用 32 位表示,R、G、B 各占 8 位,剩下 8 位未使用。
- 内存占用:32 BPP
- 是否支持透明度:否(虽然有 8 位空闲,但不用于 Alpha)
- 是否使用调色板:否
- 用途:
- 显示全彩色图像(不含透明度)
- 图像处理和渲染
- 优点:
- 支持高质量色彩
- 直接操作 RGB 像素值方便
- 缺点:
- 内存消耗大
4. Format_ARGB32
- 描述:每个像素用 32 位表示,A(Alpha)、R、G、B 各占 8 位,Alpha 未预乘到颜色中。
- 内存占用:32 BPP
- 是否支持透明度:是(Alpha 通道)
- 是否使用调色板:否
- 用途:
- 支持透明通道的图像处理
- UI 绘制、图层合成前的准备阶段
- 优点:
- 支持完整透明度信息
- 原始色彩数据清晰,便于编辑
- 缺点:
- 不利于直接用于 GPU 渲染(需额外转换为预乘格式)
5. Format_ARGB32_Premultiplied
- 描述:同样是 32 位,但 Alpha 已经预乘到 R、G、B 中:
- R = R_original × A / 255
- G = G_original × A / 255
- B = B_original × A / 255
- 内存占用:32 BPP
- 是否支持透明度:是
- 是否使用调色板:否
- 用途:
- GPU 加速渲染(如 OpenGL、DirectX)
- 快速图像混合与合成
- 优点:
- 渲染效率高(避免运行时计算预乘)
- 缺点:
- 编辑不便(颜色分量已被修改)
📌 总结对比表
格式 | 内存/像素 | 是否透明 | 是否调色板 | 主要用途 | 特点 |
---|---|---|---|---|---|
Format_Mono |
1 bit | ❌ | ❌ | 黑白图像、文档打印 | 极低内存,仅黑白 |
Format_RGB555 |
16 bit | ❌ | ❌ | 低资源设备彩色图像 | 色彩有限,内存少 |
Format_RGB32 |
32 bit | ❌ | ❌ | 全彩图像显示 | 色彩丰富,无透明 |
Format_ARGB32 |
32 bit | ✅ | ❌ | 支持透明度的图像处理 | 原始 Alpha 数据 |
Format_ARGB32_Premultiplied |
32 bit | ✅ | ❌ | GPU 渲染、快速合成 | Alpha 预乘,渲染高效 |
✅ 使用建议
场景 | 推荐格式 |
---|---|
简单黑白图像(如图标、遮罩) | Format_Mono |
彩色图像处理(含 UI 设计、绘图工具) | Format_RGB32 |
支持透明度的图像处理(如 PNG) | Format_ARGB32 |
GPU 渲染、视频输出、快速合成 | Format_ARGB32_Premultiplied |
旧设备兼容性需求 | Format_RGB555 |
🔧 示例:格式转换
QImage image("input.png");
QImage rgbaImage = image.convertToFormat(QImage::Format_ARGB32); // 支持透明度
QImage rgb32Image = image.convertToFormat(QImage::Format_RGB32); // 去掉透明度
QImage monoImage = image.convertToFormat(QImage::Format_Mono); // 转换为黑白
🧠 小贴士
- 预乘 Alpha 的优势:在进行图像叠加、混合等操作时,GPU 或渲染引擎可以直接使用预乘后的颜色值,无需额外计算。
- 非预乘的优势:保留原始颜色信息,适合图像编辑器、设计软件。
- Mono 适用于打印机或热敏纸场景:如你当前项目中的打印缓冲区绘制。
如你的代码中有 image.fill(Qt::transparent)
,说明你希望支持透明背景,推荐使用 Format_ARGB32
或 Format_ARGB32_Premultiplied
。