[python] PIL을 사용하여 PNG 이미지를 문자열에 쓰는 방법은 무엇입니까?

PIL을 사용하여 이미지를 생성했습니다 . 메모리의 문자열에 어떻게 저장할 수 있습니까? 이 Image.save()메서드에는 파일이 필요합니다.

이러한 이미지를 사전에 여러 개 저장하고 싶습니다.



답변

BytesIO클래스를 사용하여 파일처럼 동작하는 문자열 주위에 래퍼를 가져올 수 있습니다 . BytesIO객체는 파일과 동일한 인터페이스를 제공하지만, 단지 메모리에 내용을 저장합니다

import io

with io.BytesIO() as output:
    image.save(output, format="GIF")
    contents = output.getvalue()

format매개 변수를 사용하여 출력 형식을 명시 적으로 지정해야합니다 . 그렇지 않으면 자동으로 감지하려고 할 때 PIL에서 오류가 발생합니다.

파일에서 이미지를로드 한 경우 format원본 파일 형식을 포함 하는 매개 변수가 있으므로이 경우 format=image.format.

io모듈을 도입하기 전에 이전 Python 2 버전 에서는 StringIO모듈을 대신 사용했을 것입니다.


답변

Python3의 경우 BytesIO를 사용해야합니다.

from io import BytesIO
from PIL import Image, ImageDraw

image = Image.new("RGB", (300, 50))
draw = ImageDraw.Draw(image)
draw.text((0, 0), "This text is drawn on image")

byte_io = BytesIO()

image.save(byte_io, 'PNG')

더 읽기 : http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image


답변

sth의 솔루션이 나를 위해 작동하지
않았기 때문에 …

Imaging / PIL / Image.pyc line 1423-> raise KeyError (ext) # 알 수없는 확장

StringIO 케이스에 존재하지 않는 파일 이름의 확장자에서 형식을 감지하려고했습니다.

매개 변수에서 직접 형식을 설정하여 형식 감지를 우회 할 수 있습니다.

import StringIO
output = StringIO.StringIO()
format = 'PNG' # or 'JPEG' or whatever you want
image.save(output, format)
contents = output.getvalue()
output.close()


답변

save()파일과 같은 객체와 경로를 취할 수 있으므로 다음과 같은 메모리 내 버퍼를 사용할 수 있습니다 StringIO.

buf = StringIO.StringIO()
im.save(buf, format='JPEG')
jpeg = buf.getvalue()


답변

최신 버전 (2017 년 중반 Python 3.5 및 Pillow 4.0 기준) :

StringIO는 더 이상 예전처럼 작동하지 않는 것 같습니다. BytesIO 클래스는이를 처리하는 적절한 방법입니다. Pillow의 저장 기능은 문자열을 첫 번째 인수로 예상하며 놀랍게도 StringIO를 인식하지 않습니다. 다음은 이전 StringIO 솔루션과 유사하지만 그 자리에 BytesIO가 있습니다.

from io import BytesIO
from PIL import Image

image = Image.open("a_file.png")
faux_file = BytesIO()
image.save(faux_file, 'png')


답변

“사전에 이러한 이미지를 많이 저장하고 싶습니다”라고 말하면 이것이 메모리 내 구조인지 아닌지 명확하지 않습니다.

메모리에서 이미지를 온유하게 만들기 위해이 작업을 수행 할 필요가 없습니다. image사전에 개체를 보관하십시오 .

딕셔너리를 파일에 쓰려면 im.tostring()메소드와 Image.fromstring()함수 를보고 싶을 것입니다.

http://effbot.org/imagingbook/image.htm

im.tostring () => 문자열

표준 “원시”인코더를 사용하여 픽셀 데이터가 포함 된 문자열을 반환합니다.

Image.fromstring (모드, 크기, 데이터) => 이미지

표준 “원시”디코더를 사용하여 문자열의 픽셀 데이터에서 이미지 메모리를 만듭니다.

“형식”(.jpeg, .png 등)은 파일을 교환 할 때 디스크에서만 중요합니다. 파일을 교환하지 않는 경우 형식은 중요하지 않습니다.


답변