반응형
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
여기에 그림 바이트 문자열이 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 파일입니다. Moreover, you are not parsing the ascii HEX representation of the stream into proper bytes: 즉, 해당 파일의 "ff"시퀀스가 숫자 255의 바이트 대신 두 개의 c 문자 "f"로 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. 댓글에 게시-이 방법 :
>>> 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)
참조 페이지 https://stackoverflow.com/questions/14759637
반응형
'파이썬' 카테고리의 다른 글
파이썬 Python Weather API (0) | 2021.01.26 |
---|---|
파이썬 How to split a column into two columns? (0) | 2021.01.26 |
파이썬 목록 및 문자열에서 일치하는 단어 찾기 (0) | 2021.01.26 |
파이썬 How do I change the figure size with subplots? (0) | 2021.01.26 |
파이썬 Django에서 선택 항목을 확인란으로 표시하는 방법이 있습니까? (0) | 2021.01.26 |
댓글