我想要在QImage中显示图像。
这是填充行* cols image:
的代码片段 rgbMapped[row][col * 3] = red;
rgbMapped[row][col * 3 + 1] = green;
rgbMapped[row][col * 3 + 2] = blue;
正如您所看到的,我的数据缓冲区是“行高”并且是“cols * 3 wide”
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,它允许我拦截一些鼠标事件,但我不知道任何绘制函数或任何东西。
当我运行此代码时,我的返回会显示为看起来像我的图像的图像,除了有三个副本,一个带有绿色色调,一个看起来是黄色,一个带有明显的紫色色调。
如果这三个数据相互叠加,似乎可能是正确的图像?
答案 0 :(得分:1)
只是一个假设,但是从你提到的(错误)颜色,我怀疑问题可能出在你的char **rgbMapped
变量的分配/初始化代码上。
你可以发这个代码吗?
我将尝试编写一个可能正确的(?)初始化代码 只是给你一个可能有帮助的提示(我没有编译代码, 因此,我为任何语法错误道歉)。 我使用malloc(),但你也可以使用new()运算符。
// allocate a single buffer for all image pixels
unsigned char *imgbuf = malloc(3 * getWidth() * getHeight());
// allocate row pointers
unsigned char **rgbMapped = malloc(getHeight() * sizeof (unsigned char *));
// Initialize row pointers
for (int h=0; h < getHeight(); h++)
{
*rgbMapped[h] = &imgbuf[h * 3 * getWidth()];
}
// ... do your processing
// Free the image buffer & row pointers
free(imgbuf);
imgbuf = NULL;
free(rgbMapped);
rgbMapped = NULL;
重要的部分是行指针的初始化(你忘记了* 3?)。 只是我的2c。
答案 1 :(得分:0)
你是在考虑迈步吗? 每条扫描线必须以4字节边界开始。 它也可能不是打包像素格式,因此每个像素是4个字节而不是3个