0

我有一张我想在 QImage 中显示的图像。

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

    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,它允许我拦截一些鼠标事件,但我不会对任何绘图函数或任何东西做任何事情。

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

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

4

2 回答 2

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。

于 2011-03-18T03:27:16.797 回答
0

你在考虑步幅吗?每条扫描线必须从 4 字节边界开始。它也可能不是打包像素格式,所以每个像素是 4 个字节而不是 3

于 2011-03-18T14:09:55.107 回答