c++ - 大QImage的问题

标签 c++ qt qgraphicsscene qimage qpixmap

我是 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() 时,指针变为空并且 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/

相关文章:

c++ - 快速中值更新算法

c++ - C++ 中的继承和模板 : Why doesn't the following piece of code compile?

c++ - 为什么当我在 MFC 中创建动态控件时我的程序被锁定

c++ - Qt 插件中的 QObject 工厂(非创建者)

C++ GUI QSpinBox 没有出现

c++ - 使用 qt3d 渲染一个已经加载的网格

c++ - Qt 从 QGridLayout 的自定义对象访问变量

python - 使用 PySide 在 QGraphicsScene 中选择项目?

c++ - QGraphicsPathItem 重叠的半透明路径变得更加不透明

c++ - 如何知道 EDIT 控件中绘制文本的偏移量?