2011-05-27 102 views
2

我想知道我裝入的QImage是否包含alpha通道。我已經知道QImage::hasAlphaChannel()可以告訴我,如果我使用的圖像格式支持alpha通道,但有沒有辦法知道它是否實際上在加載的圖像中使用?檢查QImage是否有alpha通道

+2

「二手」是什麼意思?至少有一個像素與alpha不同,不透明? – vines 2011-05-27 20:34:14

+0

@vines是的,這就是我的意思。 – Pieter 2011-05-28 10:48:53

回答

3

這裏你有我的代碼來檢查alpha是否真的被使用。當圖像位於ARGB32時非常有用。

bool useAlpha = false; 
const uchar* pixelData = image.bits(); 
int bytes = image.byteCount(); 

for (const QRgb* pixel = reinterpret_cast<const QRgb*>(pixelData); bytes > 0; pixel++, bytes -= sizeof(QRgb)) { 
    if (qAlpha(*pixel) != UCHAR_MAX) { 
     useAlpha = true; 
     break; 
    } 
} 

還記得還有format()方法。

+0

我讀過你應該儘可能使用'static_cast'而不是'reinterpret_cast'。我的編譯器不會讓我在這種情況下使用'static_cast'。你能解釋一下在這種情況下使用'reinterpret_cast'是什麼,以及爲什麼'static_cast'不起作用? – Pieter 2011-05-28 09:23:57

+0

@Pieter [QRgb](http://doc.qt.nokia.com/4.7/qcolor.html#QRgb-typedef)('unsigned int')與uchar('unsigned char')是不同的類型,因此指針是不相容。 'static_cast'只對相關類型(如類及其子類)有用。檢查:http://www.cplusplus.com/doc/tutorial/typecasting/。 [bits()](http://doc.qt.nokia.com/4.7/qimage.html#bits)返回指向第一個像素數據的指針,正如我之前所說的,我認爲該圖像是32bpp格式,到QRgb *是安全的並且實際上是必需的,正如[scanline()](http://doc.qt.nokia.com/4.7/qimage.html#scanLine)說明所解釋的那樣。 – przemoc 2011-05-28 09:40:21

+0

感謝您的幫助! – Pieter 2011-05-28 10:59:32

1

如果將加載QImage的格式設爲Alpha通道,則您的QImage具有Alpha通道。

如果您正在檢查圖像中任何具有Alpha通道的像素實際上是否將任何像素設置爲不透明的像素,您可以嘗試使用QImage::createAlphaMask()生成Alpha遮罩並檢查其像素值。

+1

[createAlphaMask()](http://doc.qt.nokia.com/4.7/qimage.html#createAlphaMask)在這裏沒有任何理由。 IOW:沒有理由爲了檢查其內容而創建另一個QImage,因爲您可以在原始圖像中執行此操作。重要的是,這種方法的圖像是1bpp,因此會丟失信息。 – przemoc 2011-05-27 22:00:27

相關問題