4

1から10までの値を持つ配列10X10があります。次に、各値に一意の色を付けたいとします(たとえば、1は青になり、2は赤になります)。画像を表すためにqtqimageを使用しています。これが私がしていることです

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

確かにもっと速い方法があります:unsigned charsの配列を作成し、ピクセル値を直接変更します。次に、この配列から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 に答える