Python PIL字节到图像

标签 python image binary python-imaging-library drawtext

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

最佳答案

该图像不是由原始字节构成的,而是一个编码的 JPEG 文件。 此外,您没有将流的 ascii HEX 表示解析为正确的字节: 也就是说,该文件中的“ff”序列作为两个 c 字母“f”而不是数字 255 的字节传递给 PIL。

因此,首先,您将字符串解码为正确的字节序列 - 对卷积感到抱歉 - 可能有更好的方法来做到这一点,但我现在进展缓慢:

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)

现在,您将其作为 JPEG 图像导入 PIL:

>>> from PIL import Image
>>> import cStringIO as StringIO
>>> stream = StringIO.StringIO(b_data)
>>> img = Image.open(stream)
>>> img.size
(320, 240)

关于Python PIL字节到图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14759637/

相关文章:

python - 用gstreamer接收RTP流

python - 命令 "python setup.py egg_info"失败,错误代码 1 in/tmp/pip-build-hg0dbjgz/mysqlclient/

在C中将 float 转换为二进制

algorithm - 有效生成具有固定设置位和已知按位与结果的随机二进制数

binary - VHDL如何处理溢出?

python - 有没有办法在 python 中为带有类型提示的函数参数指定一系列有效值?

python - 为什么 pylint 告诉我我的 dict 属性是一个 undefined variable ?

arrays - 如何将图像数组传递给 detailView Swift?

javascript - 在 JavaScript 中获取图像数据 URL?

html - 如何让 srcset 识别出图像不会在小显示器上以全尺寸显示?