Qt/C++, Problems with large QImage

Posted by David Günzel on Stack Overflow See other posts from Stack Overflow or by David Günzel
Published on 2012-11-26T23:02:31Z Indexed on 2012/11/26 23:03 UTC
Read the original article Hit count: 299

Filed under:
|
|
|
|

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

© Stack Overflow or respective owner

Related posts about c++

Related posts about qt