본문 바로가기
파이썬

파이썬 Python PIL bytes to Image

by º기록 2021. 1. 26.
반응형
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

 

 

반응형

댓글