我正在尝试访问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()函数——即使是在索引图像上——来获取颜色信息,这些信息实际上应该以不同的方式存储。。。这似乎应该失败。。。
有没有办法让第一个版本,使用扫描线,适用于其他图像类型?
为什么使用扫描线获取数据似乎是首选方法?
我试过了,结果成功了。。。在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 () );