如何在QImage中显示此数据缓冲区

时间:2011-03-17 18:55:57

标签: c++ qt qt4 qgraphicsview qgraphicsitem

我想要在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,它允许我拦截一些鼠标事件,但我不知道任何绘制函数或任何东西。

当我运行此代码时,我的返回会显示为看起来像我的图像的图像,除了有三个副本,一个带有绿色色调,一个看起来是黄色,一个带有明显的紫色色调。

如果这三个数据相互叠加,似乎可能是正确的图像?

2 个答案:

答案 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个