2011-03-17 56 views
0

显示此数据缓冲区我有我试图在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,但我dindt做anyhting与任何涂料的功能或任何东西。

当我运行此代码时,我的回归图像看起来像我的图像,除了有三个副本,一个具有绿色色调,一个看起来像黄色,另一个具有明显的紫色色调。

看起来也许这将是正确的形象,如果这三个数据的相互were..overlayed?

+0

4个字节 - 我试图简化测试用例和图像保存到文件中,而不是或使用QPainter直接绘制。只是为了确保QImage-QPixmap转换或graphicsview没有任何问题。 - 我的第一个猜测是,行和列会混淆不清。 – 2011-03-17 21:04:39

+0

3副本,你的意思是你有3个相同的图像水平或垂直挤压成相同大小的图像?或者结果是它假定的宽度或高度的3倍? – 2011-03-18 01:29:50

+0

它应该是3倍的宽度。我认为这部分可能是因为我的getHeight()和getWidth()返回数组的维数。那应该是图像的尺寸吗? – Derek 2011-03-18 15:28:23

回答

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。

+0

我喜欢这种方法。你可以得到一个连续的内存块,可以用括号表示来访问。+1 – Derek 2011-03-18 15:29:58

+0

只是为了避免混淆:在上面的代码示例中,我假定getHeight(),getWidth()引用实际图像的高度和宽度 - 而不是所需字符数组的宽度。另一种方法是在每个行指针上分配一个内存块,但在某些系统中速度较慢并且更容易出现内存碎片情况。 – 2011-03-18 17:32:58

0

你占步伐?每条扫描线必须以4字节边界开始。 此外,它可能不是一个打包的像素格式,以使得每个像素是不是3

+0

我不知道扫描线必须位于4字节边界 – Derek 2011-03-18 15:30:37

+0

这不是问题。他让QImage分配内存并使用它的扫描线缓冲区。任何步幅要求将由QImage代码处理。 – 2011-03-19 01:42:45