0
我想在QImage
上使用蒙版。 要處理面具,我有一個QBitmap
。現在我正在尋找一個快速的方法來做到這一點的東西:如何修改QBitmap的像素
- 反轉的面具位 面具的
- 像素集合到一個新的價值
是有一個快速的方法做這個?或者我只能用QPainter
對象來修改QBitmap
?
問候
我想在QImage
上使用蒙版。 要處理面具,我有一個QBitmap
。現在我正在尋找一個快速的方法來做到這一點的東西:如何修改QBitmap的像素
是有一個快速的方法做這個?或者我只能用QPainter
對象來修改QBitmap
?
問候
最好的辦法是使用QImage
設置爲QImage::Format_Mono
格式。通過這種方式,您可以創建一個每像素1位的圖像,您可以將其用作蒙版。
invertPixels
方法。QImage
位可以使用bits
或scanLine
方法訪問。要使用QImage
作爲掩模,你必須把它轉換爲一個QPixmap
第一:
由於QImage::Format_Mono
編碼像素MSB第一(指第一像素將被存儲在最顯著第一個字節)與8個像素/字節的位,你需要一些位魔法訪問正確的位爲給定的X/Y位置:
int GetPixel(const QImage& img, const int x, const int y) const
{
const uchar mask = 0x80 >> (x % 8);
return img.scanLine(y)[x/8] & mask ? 1 : 0;
}
void SetPixel(QImage& img, const int x, const int y, const int pixel)
{
const uchar mask = 0x80 >> (x % 8);
if (pixel)
img.scanLine(y)[x/8] |= mask;
else
img.scanLine(y)[x/8] &= ~mask;
}
當然,不使用函數裏當你操縱同一行上的很多像素時,你不想爲每個像素查找scanLine(y)
。有創意!
謝謝。我也有這個想法。但是,我必須每次將QImage轉換爲QBitmap,以將其用作掩碼。或者我怎樣才能將Qimage當作面具使用? (當時我使用'QPainter'的setClipRegion()方法來設置掩碼) – 2014-09-22 13:29:45
問題是'setMask'也是一個昂貴的操作,因爲'QBitmap'仍然需要被轉換爲一個依賴於設備'QPixmap'。所以也許最好是在面具改變時只更新'QPixmap'面具(除非你爲每個油漆改變它)。也許你可以使用畫家的['Composition Modes'](http://qt-project.org/doc/qt-5/qpainter.html#composition-modes)之一(似乎不適用於OpenGL畫家雖然) – 2014-09-22 13:39:37
'構成模式'幫助我。目前我使用'QImage'的'setPixel'方法,但我認爲如果我想修改大量的像素,位操作更快。問題是,'bits()'只返回一個帶有'uchar'的指針。你能說我,如何設置像素x的值? – 2014-09-22 14:52:23