嗨,我的程序有点问题,但我不明白错误。当我尝试打开图像时出现错误,然后图像出现在框下方,但颜色错误,红色/黄色/橙色变为蓝色。对不起我的英文,只需看屏幕下的。
我的主要代码:
从程序加载后的图像: http://i.stack.imgur.com/O7q26.png
原单: http://i.stack.imgur.com/Ztm80.jpg
有人知道出了什么问题吗?
答案 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的值的十六进制表示