Python 库 PIL,加载图像为蓝色
Python library PIL, loaded image is blue
您好,我的程序有点问题,但我不明白哪里出了问题。当我尝试打开图片时出现错误,然后图片出现在下面的框中,但是颜色不对,red/yellow/orange 颜色变为蓝色。抱歉我的英语不好,请看下面的屏幕。
我的主要代码:
从程序加载后的图像:
http://i.stack.imgur.com/O7q26.png
原文:
http://i.stack.imgur.com/Ztm80.jpg
有人知道哪里出了问题吗?
诚然我没有使用过QT(我什至没有安装它,所以我无法测试),但在我看来这就是你的问题所在:
my_image.data = data = img.convert('RGBA').tobytes('raw', 'RGBA')
my_image.qt = img_qt = QImage(data, img.size[0], img.size[1], QImage.Format_ARGB32)
您正在以 RGBA 格式存储图像并以 ARGB 格式加载它。当然,颜色会被调换。
但是,由于从屏幕截图看来只是交换了蓝色和红色,我猜测其中也存在一些端序不匹配,因此您可以有效地以 BGRA 格式加载它。 PIL 以指定的顺序为您提供字节——R、G、B、A——因此 QT 可能将每个像素加载为小端字。请尝试 .tobytes('raw', 'BGRA')
。
PIL 中 RGBA
和 Qt 中 Format_ARGB32
的二进制表示不同。
PIL 以 b'rrggbbaa'
*(因此是 RGBA)的形式将像素 (r, g, b, a)
存储为字节,这将对应于 0xaabbggrr
* 的 32 位整数。
Qt 使用 32 位整数 0xaarrggbb
(因此是 ARGB),转换为字节将是 b'bbggrraa'
所以你可以看到在二进制表示中红色和蓝色的字节被交换了。要正确地将 PIL 图像转换为 QImage,您应该使用 PIL.ImageQt
模块中的 toqimage()
函数。
*其中 rr、gg、bb 和 aa 代表 r、g、b、a 值的十六进制表示
您好,我的程序有点问题,但我不明白哪里出了问题。当我尝试打开图片时出现错误,然后图片出现在下面的框中,但是颜色不对,red/yellow/orange 颜色变为蓝色。抱歉我的英语不好,请看下面的屏幕。
我的主要代码:
从程序加载后的图像: http://i.stack.imgur.com/O7q26.png
原文: http://i.stack.imgur.com/Ztm80.jpg
有人知道哪里出了问题吗?
诚然我没有使用过QT(我什至没有安装它,所以我无法测试),但在我看来这就是你的问题所在:
my_image.data = data = img.convert('RGBA').tobytes('raw', 'RGBA')
my_image.qt = img_qt = QImage(data, img.size[0], img.size[1], QImage.Format_ARGB32)
您正在以 RGBA 格式存储图像并以 ARGB 格式加载它。当然,颜色会被调换。
但是,由于从屏幕截图看来只是交换了蓝色和红色,我猜测其中也存在一些端序不匹配,因此您可以有效地以 BGRA 格式加载它。 PIL 以指定的顺序为您提供字节——R、G、B、A——因此 QT 可能将每个像素加载为小端字。请尝试 .tobytes('raw', 'BGRA')
。
PIL 中 RGBA
和 Qt 中 Format_ARGB32
的二进制表示不同。
PIL 以 b'rrggbbaa'
*(因此是 RGBA)的形式将像素 (r, g, b, a)
存储为字节,这将对应于 0xaabbggrr
* 的 32 位整数。
Qt 使用 32 位整数 0xaarrggbb
(因此是 ARGB),转换为字节将是 b'bbggrraa'
所以你可以看到在二进制表示中红色和蓝色的字节被交换了。要正确地将 PIL 图像转换为 QImage,您应该使用 PIL.ImageQt
模块中的 toqimage()
函数。
*其中 rr、gg、bb 和 aa 代表 r、g、b、a 值的十六进制表示