私は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=8000
img = 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を返します。
だから私は何が間違っているのですか?または、ピクセルレベルで大きな画像を変更するより良い方法はありますか?
よろしく、デビッド