繁体   English   中英

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

[英]How to display this data buffer in a QImage

我有一个图像试图显示在QImage中。

这是填充行* cols图像的代码片段:

    rgbMapped[row][col * 3] = red;

    rgbMapped[row][col * 3 + 1] = green;

    rgbMapped[row][col * 3 + 2] = blue;

如您所见,我的数据缓冲区为“行高”,为“ cols * 3宽”

rgbMapped是一个无符号的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,它允许我拦截某些鼠标事件,但是我不会使用任何绘画功能或任何东西进行任何操作。

当我运行此代码时,我的返回信息将以与我的图像相似的图像的形式返回,除了三份,一份带有绿色,一份看上去是淡黄色,另一份带有明显的紫色。

如果这三部分数据彼此重叠,则好像是正确的图像?

只是一个假设,但是从您提到的(错误的)颜色来看,我怀疑问题可能出在与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。

您在大步向前吗? 每条扫描线必须从4字节边界开始。 而且它可能不是压缩像素格式,因此每个像素为4字节而不是3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM