【问题标题】:getting image color information from both RGB32 and indexed type images从 RGB32 和索引类型图像中获取图像颜色信息
【发布时间】:2023-04-11 01:14:02
【问题描述】:

我正在尝试访问 QImage 中的图像颜色。

我在文档中发现最多的方法是基于扫描线函数...

我试过了,它在 RGB32 图像上有效。使用精确方法获取 8 位索引或单色图像的颜色数据时,我得到了令人惊讶且令人不快的结果。

这是我的代码:

// note RGBTriple is a struct containing unsigned R, G, B
// rgbImage.pixels is a RGBTriple* array

RGBTriple* pTriple = rgbImage.pixels;
for (int y = 0; y < source.height(); y++)
{
    const unsigned char* pScanLine = source.scanLine(y);
    for (int x = 0; x < source.width(); x++)
    {
         QRgb* color = (QRgb*)pScanLine;
         pTriple->R = qRed(*color);
         pTriple->G = qGreen(*color);
         pTriple->B = qBlue(*color);
         ++pTriple;
         pScanLine += 4;
    }
}

使用 8 位索引或单色图像运行相同的代码,我在创建获取颜色时出错。文档说扫描线与 32b 的倍数对齐 - 但由于这是 8 和 2 的倍数,我认为这不是问题。

一旦我发现对于所有类型的输入图像都没有得到正确的结果,我将其更改为

RGBTriple* pTriple = rgbImage.pixels;
for (int y = 0; y < source.height(); y++)
{
    for (int x = 0; x < source.width(); x++)
    {
        pTriple->R = qRed(source.pixel(x, y));
        pTriple->G = qGreen(source.pixel(x, y));
        pTriple->B = qBlue(source.pixel(x, y));
        ++pTriple;
    }
}

完美运行...我想知道它是否更慢或会有其他意外行为?毕竟,我正在使用 pixel() 函数 - 即使在索引图像上 - 来获取颜色信息,实际上应该以不同的方式存储......这似乎应该失败......

有没有办法让第一个版本,使用扫描线,适用于其他图像类型?

为什么使用扫描线获取数据似乎是首选方法?

【问题讨论】:

  • 关于“较慢”,至少调用一次pixel 并将返回值存储到临时变量...

标签: image qt colors pixel scanline


【解决方案1】:

我试过了,它在 RGB32 图像上有效。我有惊喜 - 和 使用精确方法获取 8 的颜色数据时结果令人不快 位索引或单色图像。

您不应感到惊讶,因为索引图像和单色图像是不同的格式。您发布的第一个代码 sn-p 是基于有关如何在内存中布置 RGB32(和仅限 RGB32)的知识。

考虑一下。在单色图像中R=G=B。所以只需要在内存中保存一个通道。

如果您的目标是在rgbImage.pixels 中获取rgb 图像,请使用QImage::convertToFormat()

QImage source;
QImage dest =  source.convertToFormat( QImage::Format_RGB888 );
memcpy(rgbImage.pixels, dest.bits(),dest.byteCount () );

【讨论】:

  • rgbImage.pixels 的内容是什么?它会变成一个 unsigned char* 数组,每种颜色都有一个字符 - 所以大小是 byteCount 的 3 倍?
  • 是的,它是一个arrawy rgbrgbrgb....,其中每种颜色都是一个无符号字符。 rgb24 的 dest.byteCount 已经是 3 * width * height 字节长。我希望 rgbImage.pixels 大小相同。
猜你喜欢
  • 1970-01-01
  • 2013-05-28
  • 2013-07-21
  • 2019-07-27
  • 1970-01-01
  • 2010-12-17
  • 2014-12-06
  • 1970-01-01
  • 2018-11-27
相关资源
最近更新 更多