python pil_Python的PIL字节到图像

1586010002-jmsa.png

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

i m trying to convert binary to image,and then draw the text.but i get the error with:

img = Image.frombuffer('RGB', (320,240), hex_data)

raise ValueError("not enough image data")

ValueError: not enough image data

i have uploaded the bytes string at here http://pastebin.ca/raw/2311595

and the picture size i can sure that is 320x240

ADDITIONAL

here is what i can sure the picture bytes string are from 320x240,just run the code will create a image from the bytes string

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)

SOLVED, THIS IS THE CODE UPDATED

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

解决方案

That image is not formed of raw bytes - rather it is an encoded JPEG file.

Moreover, you are not parsing the ascii HEX representation of the stream into proper bytes:

that is, an "ff" sequence in that file is being passed to PIL as two c letters "f" instead of a byte with the number 255.

So, first, you decode the string to a proper byte sequence - sorry for the convolution - it is likely there is a better way to do that, but I am on a slow day:

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. posted on hte comment - this way:

>>> import binascii

>>> b_data = binascii.unhexlify(data)

And now, you import it to PIL as a JPEG image:

>>> from PIL import Image

>>> import cStringIO as StringIO

>>> stream = StringIO.StringIO(b_data)

>>> img = Image.open(stream)

>>> img.size

(320, 240)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值