我正在尝试访问QImage中的图像颜色。
我在docs中找到的方法基于scanline函数......
我试过并且在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;
}
}
使用8bit索引或单色的图像运行相同的代码,我在创建颜色方面遇到错误。文档说扫描线与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()函数 - 甚至在索引图像上 - 来获取颜色信息,实际上应该以不同的方式存储...这似乎应该失败......
有没有办法制作第一个版本,使用扫描线,适用于其他图像类型?
为什么使用scanline来获取数据似乎是首选方法?
答案 0 :(得分:1)
我试过并且在RGB32图像上工作了......我很惊讶 - 而且 使用精确方法获取8的颜色数据时出现令人不快的结果 位索引或单色图像。
您不应该感到惊讶,因为索引和单色图像是 不同的格式 。您发布的第一个代码段基于有关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 () );