Использование Pillow Image.tobytes для переворачивания изображения и замены цветовых каналов

#python #python-3.x #python-imaging-library

#python #python-3.x #python-imaging-library

Вопрос:

У меня есть следующий код:

 img = Image.open('test.jpg')
texture_content = img.tobytes()
...
  

texture_content Содержит перевернутое изображение в формате RGB.

Я хочу, чтобы texture_content был перевернут и был в формате BGRA.

Как я могу сделать это напрямую, не используя Image.transpose и numpy для замены цветовых каналов?

Ответ №1:

В документации Image.tobytes упоминается encoder_name='raw' , но не объясняется *args .

Вот несколько примеров использования кодировщика raw:

Чтобы перевернуть изображение и поменять местами красный и синий каналы:

 img.tobytes('raw', 'BGR', 0, -1)
  

Чтобы перевернуть изображение:

 img.tobytes('raw', 'RGB', 0, -1)
  

Для замены цветовых каналов:

 img.tobytes('raw', 'BGR', 0, 1)
  

Для замены цветовых каналов и добавления дополнительного канала для альфа-версии:

 img.tobytes('raw', 'BGRX', 0, 1)
  

К сожалению, альфа-значения будут 0 , чтобы избежать этого использования Image.convert в первую очередь:

 img.convert('RGBA').tobytes('raw', 'BGRA', 0, 1)
  

Вы можете использовать Image.frombuffer для texture_content обратного чтения:

Чтение texture_content , переверните изображение и поменяйте местами красный и синий каналы.

 img = Image.frombuffer('RGBA', size, texture_content, 'raw', 'BGRA', 0, -1)