Python库PIL,加载的图像是蓝色的

时间:2016-04-27 13:35:37

标签: python pyqt4 python-imaging-library pyside

嗨,我的程序有点问题,但我不明白错误。当我尝试打开图像时出现错误,然后图像出现在框下方,但颜色错误,红色/黄色/橙色变为蓝色。对不起我的英文,只需看屏幕下的。

我的主要代码:

http://pastebin.com/9Wq9sUDb

从程序加载后的图像:  http://i.stack.imgur.com/O7q26.png

原单: http://i.stack.imgur.com/Ztm80.jpg

有人知道出了什么问题吗?

2 个答案:

答案 0 :(得分:2)

不可否认,我没有使用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')

答案 1 :(得分:1)

PIL中RGBA和Qt中Format_ARGB32的二进制表示形式不同。

PIL以(r, g, b, a) *(因此为RGBA)的形式将像素b'rrggbbaa'存储为字节,这对应于0xaabbggrr *的32位整数。

Qt使用32位整数0xaarrggbb(因此ARGB),转换为字节为b'bbggrraa'

因此,您可以看到在二进制表示中交换了红色和蓝色的字节。要将PIL图像正确转换为QImage,您应该使用PIL.ImageQt模块中的toqimage()函数。

*其中rr,gg,bb和aa代表r,g,b,a的值的十六进制表示