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
?來節省內存。