繁体   English   中英

大QImage的问题

[英]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=16000img_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM