python Image PIL в двоичный шестнадцатеричный код

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import urllib.request
import io
import binascii

data = urllib.request.urlopen('http://pastebin.ca/raw/2311595').read()
r_data = binascii.unhexlify(data)
stream = io.BytesIO(r_data)
img = Image.open(stream)
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("arial.ttf",14)
draw.text((0, 220),"This is a test11",(0,255,0),font=font)
draw = ImageDraw.Draw(img)

with open(img,'rb') as in_file: #error on here invalid file:
     hex_data = in_file.read()
# Unhexlify the data.
bin_data = binascii.unhexlify(bytes(hex_data))
print(bin_data)

Вопрос

преобразование шестнадцатеричного изображения в изображение и рисование текста на изображении, после этого преобразование изображения в двоичное шестнадцатеричное, но здесь возникла проблема with open(img,'rb') as in_file:, как преобразовать img в шестнадцатеричное?


person Community    schedule 17.02.2013    source источник
comment
Какой вариант PIL вы используете на Python 3? Подушка?   -  person Martijn Pieters    schedule 17.02.2013
comment
@MartijnPieters Я использую Aspell PIL python 3.3 lfd.uci.edu/~gohlke/pythonlibs /#пил   -  person    schedule 17.02.2013
comment
Могу ли я порекомендовать вам перейти на Pillow? Он активно поддерживается и отлично работает на Python 3.3, и в него включены важные исправления (например, обработка записи в BytesIO).   -  person Martijn Pieters    schedule 17.02.2013
comment
@MartijnPieters я не вижу поддержки Python 3.3 для Pillow?pypi.python.org/pypi/ Подушка/#загрузки   -  person    schedule 17.02.2013
comment
Как правило, вы можете создавать из исходного кода (он прекрасно поддерживает Python 3), если только вы не работаете в Windows.   -  person Martijn Pieters    schedule 17.02.2013
comment
тестовый сервер находится в окне, реальный сервер находится в Ubuntu, но в любом случае я могу нормально работать с вашим кодом, у меня нет ошибок UnsupportedOperation   -  person    schedule 17.02.2013
comment
@MartijnPieters Конечно!   -  person    schedule 17.02.2013


Ответы (1)


Объект img необходимо снова сохранить; записать его в другой объект BytesIO:

output = io.BytesIO()
img.save(output, format='JPEG')

затем получите записанные данные с помощью .getvalue() метода:

hex_data = output.getvalue()

Пейзаж PIL-for-python-3 на данный момент довольно запутан. вилка Pillow выглядит лучшей поддерживаемой версией на данный момент. Он включает в себя исправления, благодаря которым работает сохранение в объект BytesIO. Если вы столкнетесь с исключением io.UnsupportedOperation: fileno, используя приведенный выше код, у вас есть версия, которая еще не была исправлена, и в этом случае вам придется вместо этого прибегнуть к использованию временного файла.

person Martijn Pieters    schedule 17.02.2013
comment
Сохранив PIL.Image в io.BytesIO(), я получил исключение UnsupportedOperation: fileno PIL от CherryPy. Я не знаю, то же самое или что-то похожее, но переключение на Pillow тоже сработало, спасибо. - person Jonathan Root; 07.08.2013
comment
Это было бы в Python 2, а не 3... StringIO в Py3 указывало бы, что вы используете текстовый режим, и давало бы кодировать данные для получения двоичных данных, которые могут быть повреждены из-за применения перевода новой строки. - person Martijn Pieters; 08.09.2013
comment
Вы уже видели мои комментарии выше по этому вопросу? :-) - person Martijn Pieters; 10.09.2013
comment
Я использую движок приложения и застрял с версией PIL, которая выдает исключение io.UnsupportedOperation: fileno. Однако я обнаружил, что версия PIL может записывать в объект StringIO, как описано здесь. - person Ying Xiong; 01.05.2015
comment
@YingXiong: этот ответ был специально написан для Python 3, а не для Python 2. Google App Engine использует Python 2.7, а не 3. - person Martijn Pieters; 01.05.2015
comment
Я здесь, потому что я также использую App Engine и попал в ту же лодку. Мой код хорошо работал в автономном режиме, но при работе с Google я дал мне io.UnsupportedOperation: fileno - person Jonny; 07.07.2015
comment
@RonaldoFelipe, тогда убедитесь, что вы узнали, в каком формате вам нужно сохранить его. Я не могу с этим помочь, не без гораздо дополнительной информации о том, что вам нужно делать с данными изображения. - person Martijn Pieters; 25.06.2020