5

私はC++/ Qtにかなり慣れていないので、Visual Studio C ++とQt(4.8.3)を使用してアプリケーションを作成しようとしています。アプリケーションはQGraphicsViewを使用して画像を表示します。画像をピクセルレベルで変更する必要があります。

基本的なコードは(簡略化)です:

QImage* img = new QImage(img_width,img_height,QImage::Format_RGB32);
while(do_some_stuff) {
  img->setPixel(x,y,color);
}
QGraphicsPixmapItem* pm = new QGraphicsPixmapItem(QPixmap::fromImage(*img));
QGraphicsScene* sc = new QGraphicsScene;
sc->setSceneRect(0,0,img->width(),img->height());
sc->addItem(pm);
ui.graphicsView->setScene(sc);

これは、約12000x6000ピクセルまでの画像に適しています。このサイズを超えると奇妙なことが起こります。たとえば、を設定するimg_width=16000と、その行はnull画像を返します。画像データは約512,000,000バイトである必要があるため、32ビットシステムでも大きすぎないようにする必要があります。また、私のマシン(Win 7 64ビット、8 GB RAM)はデータを保持できる必要があります。img_height=8000img = new QImage(...)

私もこのバージョンを試しました:

uchar* imgbuf = (uchar*) malloc(img_width*img_height*4);
QImage* img = new QImage(imgbuf,img_width,img_height,QImage::Format_RGB32);

最初は、これは機能します。imgポインターは有効でありimg->width()、たとえば呼び出すと、正しい画像幅が返されます(画像ポインターがnullの場合は0ではありません)。しかし、を呼び出すとすぐにimg->setPixel()、ポインタはnullになり、img->width()0を返します。

だから私は何が間違っているのですか?または、ピクセルレベルで大きな画像を変更するより良い方法はありますか?

よろしく、デビッド

4

3 に答える 3

4

QImageは、最大32768x32768ピクセルの画像(短い署名)をサポートします。これは、次の条件から得られます。幅*高さ*色深度<INT_MAX(40億)-> 32768 * 32768 * 4=40億。2番目の条件は、もちろん、mallocが要求されたメモリを割り当てることができるということです。

より大きな画像が本当に必要な場合は、別のラッパーを使用するか、複数のQImageに分割する必要があります。

于 2012-11-26T23:38:05.827 に答える
2

問題を突き止めました。/LARGEADDRESSAWAREリンカーオプションにフラグを追加するのを忘れました。

また、scanLine()ヒントを使用したStephenChuの回答にも本当に感謝しています。まず、メモリを節約します。次に、実際にはるかに高速です。

これで、希望する目標である32000x16000ピクセルまでの画像を安全に作成できます。

于 2012-11-28T22:38:19.667 に答える
1

2番目のアプローチは正しい方法です。を呼び出すとsetPixel()QImage指定した外部バッファのコピーが作成され、メモリが不足するという問題が発生します。

提供されたバッファで直接ピクセル値を変更してみてください。scanLine()行のバッファへのポインタを取得するために使用できます。setPixel()本当に遅いのでとにかく使いません。

于 2012-11-27T19:59:21.453 に答える