2011-05-21 106 views
2

我有一個數組10X10值介於1到10.現在說我想給每個值一個獨特的顏色(說1得到藍2得到紅色等)。我使用qt qimage來表示圖像。 下面是我在做什麼快速圖像處理

read array from disk. store in a[10][10] 
generate a hash table in which each value in the array has a corresponding qRGB 
for entire array 
    get value (say a[0][0]) 
    search hashtable, get equivalent qRGB 
    image.setPixel(coord,qRGB) 

這是我能做到的最快方法是什麼?我有一個很大的圖像,掃描每個像素,在散列表中搜索它的值,設置像素有點慢。有更快的方法嗎?

回答

9

確實有一個更快的方法:創建一個無符號字符數組並直接修改像素值。然後從這個數組中創建一個QImage。調用setPixel()非常昂貴。

unsigned char* buffer_; 
buffer_ = new unsigned char[4 * w * h]; 
//... 


for(int i = 0; i < h; i++){ 
for(int j = 0; j < w; j++){ 

    unsigned char r, g, b; 
    //... 

    buffer_[4 * (i * w + j) ] = r; 
    buffer_[4 * (i * w + j) + 1] = g; 
    buffer_[4 * (i * w + j) + 2] = b; 
} 
} 

這對的QImage :: format_RGB32和你的paintEvent()將是這個樣子:

void paintEvent(QPaintEvent* event){ 
//... 
QImage image(buffer_, w, h, QImage::Format_RGB32); 
painter.drawImage(QPoint(0, 0), image); 
} 
+1

謝謝。第二種方法是使用QImage scanLine函數,它返回一個指向QImage像素數據的指針。一旦你有了這個指針,你就可以直接編輯QRgb格式的像素值 - > 0xAARRGGBB – 2011-05-24 11:11:32

4

如果你只有10種不同的顏色,你不需要使用散列表。簡單的數組就足夠了。你也不需要a[10][10]數組。從磁盤讀取時請撥打image.setPixel

如果您有許多不同的顏色將它們存儲爲RGB值而不是索引。您可以一次讀取所有數據,並使用QImage (uchar * data, int width, int height, Format format)創建圖像。它將比單獨設置每個像素快得多。

+0

可惜我不能用RGB值替換現有的索引。而且我無法預測正在使用的顏色數量。它的範圍可以從1色到2^32種顏色。更好的解決方案? – 2011-05-22 04:40:12

+0

@ sleeping.ninja很難說不知道你到底在做什麼。如果您只需要不同的顏色,請將索引直接映射到RGB。如果你需要它們在視覺上不同,使用一些散列函數。如果你需要以某種特定的方式映射它們,並且比從哈希表中獲取它們要慢,我不知道你能做什麼。 – 2011-05-22 10:20:06