【发布时间】:2011-07-17 15:53:42
【问题描述】:
我想在 QImage 中显示一张图片。
这是填充 rows*cols 图像的代码的 sn-p:
rgbMapped[row][col * 3] = red;
rgbMapped[row][col * 3 + 1] = green;
rgbMapped[row][col * 3 + 2] = blue;
如您所见,我的数据缓冲区是“行高”并且是“列*3 宽”
rgbMapped 是一个 unsigned char** 数组。所以回到我的 QT 代码中,我有以下内容:
QImage *qi = new QImage(getWidth(), getHeight(), QImage::Format_RGB888);
for (int h = 0; h< getHeight(); h++){
memcpy(qi->scanLine(h), rgbMapped[h], getWidth()*3);
}
QPixmap p(QPixmap::fromImage(*qi,Qt::ColorOnly));
if(scene.items().contains(item)){
scene.removeItem(item);
}
item = new ImagePixmapItem(p);
scene.addItem(item);
ui->graphicsView->setScene(&scene);
ui->graphicsView->show();
ImagePixMapItem 是我创建的一个 QGraphicsPixmapItem,它允许我拦截一些鼠标事件,但我不会对任何绘图函数或任何东西做任何事情。
当我运行此代码时,我返回的图像看起来像我的图像,除了有三个副本,一个是绿色的,一个是黄色的,一个是明显的紫色。
如果这三个数据相互重叠,看起来可能是正确的图像?
【问题讨论】:
-
- 我会尝试简化测试用例并将图像保存到文件中,或者直接使用 QPainter 进行绘制。只是为了确保 QImage-QPixmap 转换或图形视图没有问题。 - 我的第一个猜测是行和列会以某种方式混淆。
-
3 份,你的意思是你有 3 个相同的图像水平或垂直挤压成相同大小的图像?或者结果是预期的宽度或高度的 3 倍?
-
它是应有的宽度的 3 倍。我认为那部分可能是因为我的 getHeight() 和 getWidth() 正在返回数组的尺寸。那应该是图像的尺寸吗?
-
如果 getWidth() 是一个数组维度 (=3 * image-width) 上面的代码是不正确的。在“new QImage(...)”中,您应该放入 getWidth()/3,而在 memcpy(..) 中,您应该只放入 getWidth() - 而不是 getWidth()*3。我认为如果 getHeight()、getWidth() 指的是实际的图像语义而不是实现细节,它会让你的代码更清晰。在下面的回答中,我假设 getWidth() 是实际的图像宽度。
-
是的,QImage 的宽度和高度输入是像素尺寸,而不是您的数组大小。
标签: c++ qt qt4 qgraphicsview qgraphicsitem