【Qt】QImage::Format
QImage::Format
是 Qt 中用于指定图像像素数据格式的枚举类型。它决定了图像如何存储颜色信息和透明度(如果有)。选择合适的 Format
对性能、内存占用以及是否支持某些特性(如透明通道)有重要影响。
常见的 QImage::Format
枚举值及其用途:
1. 无效格式
Format_Invalid
表示无效的图像格式,通常用于错误检测或初始化。
2. 单色/黑白图像
Format_Mono
每个像素用 1 位表示,0 表示黑色,1 表示白色(未预乘透明度)。Format_MonoLSB
类似于Format_Mono
,但每个字节中最低有效位(LSB)对应第一个像素。
3. 调色板索引图像
Format_Indexed8
每个像素是一个 8 位索引值,指向一个颜色表(colorTable()
),最多支持 256 种颜色。
4. RGB 格式(无透明通道)
Format_RGB32
每个像素用 32 位表示,其中 R、G、B 各占 8 位,剩余 8 位未使用(通常为 0 或填充)。Format_RGB16
每个像素用 16 位表示,通常是 RGB565 格式(R:5, G:6, B:5)。Format_RGB888
每个像素用 24 位表示,R、G、B 各占 8 位。Format_RGB666
,Format_RGB555
,Format_RGB444
不同精度的 RGB 图像格式,适用于对内存敏感的场景。
5. ARGB 格式(带透明通道)
-
Format_ARGB32
每个像素用 32 位表示,A(Alpha)、R、G、B 各占 8 位,Alpha 未预乘(即原始 Alpha 值)。 -
Format_ARGB32_Premultiplied
同样是 32 位,但 Alpha 预乘到颜色分量中,即:-
R = R_original × A
-
G = G_original × A
-
B = B_original × A
-
A 保持不变
区别说明:
Format_ARGB32
:保留原始颜色和透明度,适合编辑和处理。Format_ARGB32_Premultiplied
:在渲染时更高效(尤其在合成操作中),因为不需要额外计算预乘 Alpha,常用于 GPU 渲染。
-
-
Format_ARGB8565_Premultiplied
使用 24 位,其中 A 占 8 位,RGB 分别为 8:5:6:5(预乘)。 -
Format_ARGB8555_Premultiplied
,Format_ARGB4444_Premultiplied
不同精度的预乘格式,适用于特定硬件或压缩需求。
6. RGBA 格式
Format_RGBA8888
每个像素用 32 位表示,R、G、B、A 各占 8 位,Alpha 未预乘。Format_RGBA8888_Premultiplied
同上,但 Alpha 预乘,适合快速合成。
7. 其他专业格式
Format_RGBX8888
32 位 RGB 格式,最后 8 位未使用(通常为 0)。Format_BGR30
,Format_RGB30
每个颜色分量占 10 位,提供更高色彩深度。Format_Alpha8
仅包含 8 位 Alpha 通道,用于遮罩或透明度图。Format_Grayscale8
8 位灰度图像,每个像素代表亮度(0 为黑,255 为白)。
如何选择正确的 Format
目标 | 推荐格式 |
---|---|
无透明度要求的彩色图像 | Format_RGB32 , Format_RGB888 |
支持透明度的图像 | Format_ARGB32 , Format_RGBA8888 |
快速合成与渲染 | Format_ARGB32_Premultiplied , Format_RGBA8888_Premultiplied |
节省内存 | Format_RGB16 , Format_Indexed8 |
灰度图像 | Format_Grayscale8 |
遮罩/透明度图 | Format_Alpha8 |
示例代码:转换图像格式
cpp
QImage image("input.png"); QImage rgbaImage = image.convertToFormat(QImage::Format_ARGB32); // 明确转成 ARGB32
小结
- 非预乘格式(如
Format_ARGB32
) 更适合图像处理与编辑。 - 预乘格式(如
Format_ARGB32_Premultiplied
) 更适合高性能渲染(尤其是图形硬件加速)。 - 如果不需要透明度,使用
Format_RGB32
或Format_RGB888
更合适。 - 对资源受限的设备,可考虑使用
Format_RGB16
或Format_Indexed8
来节省内存。