2016-04-27 5 views
0

Привет, у меня проблема с моей программой, но я не понимаю, что не так. Ошибка при попытке открыть изображение, затем изображение появится в поле внизу, но цвет неправильный, красный/желтый/оранжевый цвет изменится на синий. Извините за мой английский, просто посмотрите на экран внизу.Python library PIL, загруженное изображение синее

Мой главный код:

http://pastebin.com/9Wq9sUDb

Изображение после загрузки из программы: http://i.stack.imgur.com/O7q26.png

Orginal: http://i.stack.imgur.com/Ztm80.jpg

Кто-нибудь знает, что это не так?

+0

Похоже, что красные и синие пиксели становятся переворачивается куда-то. Глядя на код, я не могу сказать, где. –

+2

Можете ли вы сделать это более кратким вопросом? Код с ошибкой в ​​нем слишком длинный, чтобы найти ошибку. Попытайтесь изолировать проблему до одного метода. – physicalattraction

ответ

1

Правда я не использовал 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) 

You «Сохранение изображения в формате RGBA и загрузка его в формате ARGB. Естественно, цвета будут заменены.

Однако, так как это видно из скриншотов, которые меняют местами только синий и красный, я предполагаю, что там тоже есть несоответствие между ними, так что вы эффективно загружаете его в формате BGRA. PIL дает вам байты в указанном порядке - R, G, B, A - поэтому QT, вероятно, загружает каждый пиксель в виде слова little-endian. Вместо этого попробуйте .tobytes('raw', 'BGRA').

+0

Хорошо, я работаю :) Очень спасибо, я пропустил эту маленькую деталь. –

1

Бинарное представление для RGBA в PIL и для Format_ARGB32 в Qt отличается.

PIL хранит пиксель (r, g, b, a) как байты в виде b'rrggbbaa' * (следовательно, RGBA), что соответствует 32-разрядному целу 0xaabbggrr *.

Qt использует 32-битное целое 0xaarrggbb (поэтому ARGB), который преобразуется в байтах будет b'bbggrraa'

Таким образом, вы можете видеть, что в двоичном представлении байт для красного и синего выгружена. Чтобы правильно преобразовать изображение PIL в QImage, вы должны использовать функцию toqimage() из модуля PIL.ImageQt.


*, где RR, GG бб и аа стенд для шестнадцатеричного представления значений для R, G, B, A

 Смежные вопросы

  • Нет связанных вопросов^_^