[英]Problems with large QImage
我是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
和img_height=8000
,行img = new QImage(...)
返回一个空图像。 图像数据应该在512,000,000字节左右,因此它不应该太大,即使在32位系统上也是如此。 此外,我的机器(Win 7 64位,8 GB RAM)应该能够保存数据。
我也试过这个版本:
uchar* imgbuf = (uchar*) malloc(img_width*img_height*4);
QImage* img = new QImage(imgbuf,img_width,img_height,QImage::Format_RGB32);
起初,这是有效的。 img指针有效并且调用img->width()
例如返回正确的图像宽度(而不是0,以防图像指针为空)。 但是当我调用img->setPixel()
,指针变为null, img->width()
返回0。
那么我做错了什么? 或者是否有更好的方法来修改像素级别的大图像?
问候,大卫
QImage支持最多32768x32768像素图像(签名短)。 这是从以下条件得出的:宽度*高度* colordepth <INT_MAX(40亿) - > 32768 * 32768 * 4 = 40亿。 第二个条件当然是malloc能够分配所请求的内存。
如果你真的需要更大的图像,你将不得不使用另一个包装或拆分成多个QImage。
我追查了这个问题。 我忘了将/LARGEADDRESSAWARE
标志添加到链接器选项中。
我也非常欣赏Stephen Chu对scanLine()提示的回答。 首先它节省了一些内存,其次它真的要快得多。
现在我可以安全地创建高达32000x16000像素的图像,这是我想要的目标。
你的第二种方法是正确的方法。 你遇到的问题是当你调用setPixel()
, QImage
会复制你提供的外部缓冲区并为它耗尽内存。
尝试直接在提供的缓冲区中更改像素值。 您可以使用scanLine()
来获取指向行缓冲区的指针。 我不会使用setPixel()
,因为它真的很慢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.