我有一个10X10的数组,其值介于1到10之间。现在说我想给每个值一个独特的颜色(Say 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)
这是我能做到这一点的最快方式吗?我有一个大图像,扫描每个像素,在哈希表中搜索其值,设置像素有点慢。有更快的方法吗?
答案 0 :(得分: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 :(得分:4)
如果您只有10种不同的颜色,则不需要使用哈希表。简单的数组就足够了。您也不需要a[10][10]
数组。当您从磁盘读取时,只需致电image.setPixel
。
如果您有许多不同的颜色,则将它们存储为RGB值而不是索引。您可以一次阅读所有数据,并使用QImage ( uchar * data, int width, int height, Format format )
创建图像。它比单独设置每个像素要快得多。