I'm pretty new to C++/Qt and I'm trying to create an application with Visual Studio C++ and Qt (4.8.3). The application displays images using a QGraphicsView, I need to change the images at pixel level.
The basic code is (simplified):
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);
This works well for images up to around 12000x6000 pixel. The weird thing happens beyond this size. When I set img_width=16000
and img_height=8000
, for example, the line img = new QImage(...)
returns a null image. The image data should be around 512,000,000 bytes, so it shouldn't be too large, even on a 32 bit system. Also, my machine (Win 7 64bit, 8 GB RAM) should be capable of holding the data.
I've also tried this version:
uchar* imgbuf = (uchar*) malloc(img_width*img_height*4);
QImage* img = new QImage(imgbuf,img_width,img_height,QImage::Format_RGB32);
At first, this works. The img pointer is valid and calling img->width()
for example returns the correct image width (instead of 0, in case the image pointer is null).
But as soon as I call img->setPixel()
, the pointer becomes null and img->width()
returns 0.
So what am I doing wrong? Or is there a better way of modifying large images on pixel level?
Regards, David
img->setPixel()
. Previously I updated the image during "rendering". It seems like sending the image to the scene makes it impossible to usesetPixel()
again (the image becomes "null"). With only sending the image to the graphicsView (after the while-loop) it works. Now I just need to figure out how I can update the image during "rendering" nethertheless. – Jemadar