Dav*_*zel 5 c++ qt qpixmap qimage qgraphicsscene
我是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);
Run Code Online (Sandbox Code Playgroud)
这适用于高达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);
Run Code Online (Sandbox Code Playgroud)
起初,这是有效的.img指针有效,并且调用img->width()例如返回正确的图像宽度(而不是0,以防图像指针为空).但是一旦我调用img->setPixel(),指针就变为null并img->width()返回0.
那么我做错了什么?或者是否有更好的方法来修改像素级别的大图像?
问候,大卫
您的第二种方法是正确的方法。您遇到的问题是当您调用 时setPixel(),QImage会复制您提供的外部缓冲区并耗尽内存。
尝试直接在提供的缓冲区中更改像素值。您可以使用scanLine()来获取指向行缓冲区的指针。无论如何我不会使用,setPixel()因为它真的很慢。