嗨我的程序有一个小问题,但我不明白什么是错的。当我尝试打开图像时出现错误,图像出现在下方的框中,但颜色错误,红色/黄色/橙色变为蓝色。对不起,我的英文,只看屏幕下。Python库PIL,加载的图像是蓝色的
我的主要代码: http://i.stack.imgur.com/O7q26.png
原单:从程序加载后
图片 http://i.stack.imgur.com/Ztm80.jpg
任何人都知道什么是错的?
嗨我的程序有一个小问题,但我不明白什么是错的。当我尝试打开图像时出现错误,图像出现在下方的框中,但颜色错误,红色/黄色/橙色变为蓝色。对不起,我的英文,只看屏幕下。Python库PIL,加载的图像是蓝色的
我的主要代码: 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格式加载。自然,颜色将会交换。
但是,因为从截图看来,只是蓝色和红色正在交换,我猜这里还有一些endian不匹配,所以你有效地加载它在BGRA格式。 PIL以指定的顺序给出字节 - R,G,B,A - 因此QT可能会将每个像素加载为小端字。改为尝试.tobytes('raw', 'BGRA')
。
好的队友,它的工作:)非常感谢,我错过了那个小细节。 –
PIL中的RGBA
和Qt中的Format_ARGB32
的二进制表示方式不同。
PIL将(r, g, b, a)
作为字节以b'rrggbbaa'
*(因此为RGBA)的形式存储,这将对应于32位整数0xaabbggrr
*。
Qt使用一个32位整数0xaarrggbb
(因此ARGB),其转换成字节数。将b'bbggrraa'
因此可以看到,在二进制表示为红色和蓝色的字节交换。要正确地将PIL图像转换为QImage,您应该使用PIL.ImageQt
模块中的toqimage()
功能。
*,其中RR,GG,BB和AA的立场为R,G,B值的十六进制表示,一个
它看起来像红色和蓝色像素越来越某处翻转。看着代码,我不知道在哪里。 –
您能否将此作为一个更简洁的问题?带有错误的代码太长而无法搜索错误。尝试将问题隔离到单一方法。 – physicalattraction