2014-09-22 30 views
0

我想在QImage上使用蒙版。 要處理面具,我有一個QBitmap。現在我正在尋找一個快速的方法來做到這一點的東西:如何修改QBitmap的像素

  1. 反轉的面具位
  2. 面具的
  3. 像素集合到一個新的價值

是有一個快速的方法做這個?或者我只能用QPainter對象來修改QBitmap

問候

回答

1

最好的辦法是使用QImage設置爲QImage::Format_Mono格式。通過這種方式,您可以創建一個每像素1位的圖像,您可以將其用作蒙版。

  1. 要反轉像素,請使用invertPixels方法。
  2. QImage位可以使用bitsscanLine方法訪問。

要使用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)。有創意!

+0

謝謝。我也有這個想法。但是,我必須每次將QImage轉換爲QBitmap,以將其用作掩碼。或者我怎樣才能將Qimage當作面具使用? (當時我使用'QPainter'的setClipRegion()方法來設置掩碼) – 2014-09-22 13:29:45

+1

問題是'setMask'也是一個昂貴的操作,因爲'QBitmap'仍然需要被轉換爲一個依賴於設備'QPixmap'。所以也許最好是在面具改變時只更新'QPixmap'面具(除非你爲每個油漆改變它)。也許你可以使用畫家的['Composition Modes'](http://qt-project.org/doc/qt-5/qpainter.html#composition-modes)之一(似乎不適用於OpenGL畫家雖然) – 2014-09-22 13:39:37

+0

'構成模式'幫助我。目前我使用'QImage'的'setPixel'方法,但我認爲如果我想修改大量的像素,位操作更快。問題是,'bits()'只返回一個帶有'uchar'的指針。你能說我,如何設置像素x的值? – 2014-09-22 14:52:23