快速图像处理

问题描述:

我有一个数组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) 

这是我能做到的最快方法是什么?我有一个很大的图像,扫描每个像素,在散列表中搜索它的值,设置像素有点慢。有更快的方法吗?

确实有一个更快的方法:创建一个无符号字符数组并直接修改像素值。然后从这个数组中创建一个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

如果你只有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