Python PIL байты для изображения
import PIL
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import urllib.request
with urllib.request.urlopen('http://pastebin.ca/raw/2311595') as in_file:
hex_data = in_file.read()
print(hex_data)
img = Image.frombuffer('RGB', (320,240), hex_data) #i have tried fromstring
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("arial.ttf",14)
draw.text((0, 220),"This is a test11",(255,255,0),font=font)
draw = ImageDraw.Draw(img)
img.save("a_test.jpg")
Я пытаюсь преобразовать двоичный файл в изображение, а затем нарисовать текст.но я получаю ошибку:
img = Image.frombuffer('RGB', (320,240), hex_data)
raise ValueError("not enough image data")
ValueError: not enough image data
Я загрузил строку байтов здесь http://pastebin.ca/raw/2311595
и размер изображения я уверен, что это 320x240
дополнительные
вот что я уверен, что строка байтов изображения из 320x240, просто запустите код, который создаст изображение из строки байтов
import urllib.request
import binascii
import struct
# Download the data.
with urllib.request.urlopen('http://pastebin.ca/raw/2311595') as in_file:
hex_data = in_file.read()
# Unhexlify the data.
bin_data = binascii.unhexlify(hex_data)
print(bin_data)
# Remove the embedded lengths.
jpeg_data = bin_data
# Write out the JPEG.
with open('out.jpg', 'wb') as out_file:
out_file.write(jpeg_data)
РЕШЕНО, ЭТО КОД ОБНОВЛЕН
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)
#r_data = "".unhexlify(chr(int(b_data[i:i+2],16)) for i in range(0, len(b_data),2))
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",(255,255,0),font=font)
draw = ImageDraw.Draw(img)
img.save("a_test.png")
1 ответов
Это изображение не формируется из необработанных байтов-скорее это закодированный файл JPEG. Кроме того, вы не разбираете шестнадцатеричное представление ascii потока на правильные байты: то есть последовательность" ff "в этом файле передается в PIL как две буквы" f " вместо байта с номером 255.
Итак, во-первых, вы декодируете строку в правильную последовательность байтов-извините за свертку - вероятно, есть лучший способ сделать это, но я на медленном день:
data = urllib.urlopen("http://pastebin.ca/raw/2311595").read()
r_data = "".join(chr(int(data[i:i+2],16)) for i in range(0, len(data),2))
Ах, C. Y. опубликовано на hte комментарий-таким образом:
>>> import binascii
>>> b_data = binascii.unhexlify(data)
и теперь вы импортируете его в PIL как изображение JPEG:
>>> from PIL import Image
>>> import cStringIO as StringIO
>>> stream = StringIO.StringIO(b_data)
>>> img = Image.open(stream)
>>> img.size
(320, 240)