Python PIL bytes to Image

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")

j'essaie de convertir binaire de l'image,puis dessiner le texte.mais j'obtiens l'erreur:

img = Image.frombuffer('RGB', (320,240), hex_data) 
raise ValueError("not enough image data")
ValueError: not enough image data

j'ai téléchargé les octets de la chaîne ici http://pastebin.ca/raw/2311595

et la taille de l'image je peux sûr que c'est 320x240

ADDITIONAL

voici ce que je peux vous assurer que la chaîne d'octets image est à partir de 320x240, il suffit d'exécuter le code va créer une image à partir de la chaîne d'octets

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)

résolu, C'EST LE CODE DE MISE À JOUR

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")
18
demandé sur evandrix 2013-02-07 23:44:00

1 réponses

cette image n'est pas formée d'octets bruts - il s'agit plutôt d'un fichier JPEG encodé. De plus, vous n'analysez pas la représentation ASCII HEX du flux en octets appropriés.: c'est-à-dire qu'une séquence "ff" dans ce fichier est transmise à PIL sous la forme de deux lettres c "f" au lieu d'un octet portant le numéro 255.

donc, tout d'abord, vous décodez la chaîne à une séquence d'octets correcte - désolé pour la convolution - il est probable qu'il y a une meilleure façon de faire cela, mais je suis sur un lent jour:

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)) 

Ah, C. Y. posté sur hte commentaire - le de cette façon:

>>> import binascii
>>> b_data = binascii.unhexlify(data)

Et maintenant, vous devez l'importer à PIL comme une image JPEG:

>>> from PIL import Image
>>> import cStringIO as StringIO
>>> stream = StringIO.StringIO(b_data)
>>> img = Image.open(stream)
>>> img.size
(320, 240)
15
répondu jsbueno 2013-02-07 20:10:27