从 QImage 获取原始数据

2023-11-30

我有一个从像素图构建的 QImage,如下所示:

QPixmap fullPmap = topItem->pixmap();
fullPmap = fullPmap.copy(isec.toRect());
QImage chip = fullPmap.toImage();

这基本上与屏幕上的矩形相交以将图像裁剪为碎片尺寸。

我现在需要从芯片获取表示该数据的字符数组。

我怎样才能做到这一点?

我尝试过这样的事情:

  unsigned char * data = chip.bits();

当我显示“数据”时,我得到一个完全扭曲的图像,与我的实际芯片完全不同。

fullPmap 是 RGB 图像(如果有的话)。我有一些代码用于将其转换为灰度:

QRgb col;
int gray;
for (int i = 0; i < chip.width(); ++i)
{
    for (int j = 0; j < chip.height(); ++j)
    {
        col = chip.pixel(i, j);
        gray = qGray(col);
        chip.setPixel(i, j, qRgb(gray, gray, gray));
    }
}

我不太喜欢,但这似乎是做这样的事情最简单的方法。

显示从bits()返回的数据如下所示:

imwidth = chip.width();
imheight = chip.height();
QImage *qi = new QImage(imwidth, imheight, QImage::Format_RGB32);
//  #pragma omp parallel for
for (int i = 0 ; i < imheight ; i++)
    for (int j = 0 ; j < imwidth ; j++)
    {
        qi->setPixel(j,i,qRgb(data[i*imwidth + j],data[i*imwidth + j],data[i*imwidth + j]));
    }

在处理原始图像数据时,您需要注意一些基本问题:

  • 像素的格式或布局是什么 数据。转换而来的 QImage QPixmap 不一定总是在 RGB888 或 RGB32。称呼 QImage::format() 并处理 不同的布局不同。 特别是对于 RGB32 系列,您 需要确保您可以访问它们 右字节顺序(字节序)。

  • 字节并不总是布局 正好有那么多字节来保存 线的像素。通常是一条线 将有比它更多的字节 需要。使用 QImage::bytesPerLine() 来 找出并推进指针 转到时那么多字节 下一行。这可能是你的问题 在显示图像的构建中。

  • QImage::pixel() 和 setPixel() 是 真的很慢。获取/设置像素值 如果可能的话,从原始像素缓冲区。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 QImage 获取原始数据 的相关文章

随机推荐