4

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

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

4

2 回答 2

10

确实有更快的方法:创建一个无符号字符数组并直接修改像素值。然后从这个数组创建一个 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);
}
于 2011-05-24T05:41:29.080 回答
4

如果您只有 10 种不同的颜色,则不需要使用哈希表。简单的数组就足够了。你也不需要a[10][10]数组。只需image.setPixel在从磁盘读取时调用。

如果您有许多不同的颜色,请将它们存储为 RGB 值而不是索引。您可以一次读取所有数据并使用QImage ( uchar * data, int width, int height, Format format ). 它比单独设置每个像素要快得多。

于 2011-05-21T20:01:29.450 回答