我是 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()
时,指针变为空并且 img->width()
返回 0。
那我做错了什么?或者是否有更好的方法在像素级别修改大图像?
问候, 大卫
最佳答案
QImage 最多支持 32768x32768 像素的图像(短符号)。这是从条件得出的:width * height * colordepth < INT_MAX (40亿) -> 32768 * 32768 * 4 = 40亿。第二个条件当然是malloc能够分配申请的内存。
如果你真的需要更大的图像,你将不得不使用另一个包装器或拆分成多个 QImage。
关于c++ - 大QImage的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13574670/