programing

base64를 사용하여 이미지 파일 인코딩

shortcode 2022. 9. 6. 22:43
반응형

base64를 사용하여 이미지 파일 인코딩

base64 모듈을 사용하여 이미지를 문자열로 인코딩하고 싶습니다.그런데 문제가 생겼어요.인코딩할 이미지를 지정하려면 어떻게 해야 합니까?이미지에 디렉토리를 사용하려고 했지만, 그것은 단순히 디렉토리가 인코딩되는 결과로 이어집니다.저는 실제 이미지 파일을 인코딩하고 싶습니다.

편집

이 토막을 써봤습니다.

with open("C:\Python26\seriph1.BMP", "rb") as f:
    data12 = f.read()
    UU = data12.encode("base64")
    UUU = base64.b64decode(UU)

    print UUU

    self.image = ImageTk.PhotoImage(Image.open(UUU))

다만, 다음의 에러가 표시됩니다.

Traceback (most recent call last):
  File "<string>", line 245, in run_nodebug
  File "C:\Python26\GUI1.2.9.py", line 473, in <module>
    app = simpleapp_tk(None)
  File "C:\Python26\GUI1.2.9.py", line 14, in __init__
    self.initialize()
  File "C:\Python26\GUI1.2.9.py", line 431, in initialize
    self.image = ImageTk.PhotoImage(Image.open(UUU))
  File "C:\Python26\lib\site-packages\PIL\Image.py", line 1952, in open
    fp = __builtin__.open(fp, "rb")
TypeError: file() argument 1 must be encoded string without NULL bytes, not str

내가 뭘 잘못하고 있지?

제가 당신의 질문을 이해했는지 모르겠어요.당신은 다음과 같은 일을 하고 있다고 생각합니다.

import base64

with open("yourfile.ext", "rb") as image_file:
    encoded_string = base64.b64encode(image_file.read())

먼저 파일을 열고 내용을 읽어야 합니다. 단순히 인코딩 함수에 경로를 전달할 수는 없습니다.

편집: 좋습니다.원래 질문을 편집한 후의 갱신은 다음과 같습니다.

우선, Windows 로 패스 딜리미터를 사용할 때는, 이스케이프 문자를 잘못해 히트 하는 것을 막기 위해서, raw 문자열('r'로 문자열에 프리픽스)을 사용하는 것을 잊지 말아 주세요.두 번째로, PIL의 Image.open은 파일 이름 또는 파일 형식(오브젝트는 읽기, 검색 및 tell 메서드를 제공해야 합니다)을 받아들입니다.

단, cString을 사용할 수 있습니다.메모리 버퍼에서 이러한 개체를 생성하는 IO:

import cStringIO
import PIL.Image

# assume data contains your decoded image
file_like = cStringIO.StringIO(data)

img = PIL.Image.open(file_like)
img.show()

첫 번째 응답에서는 접두사 b'가 붙은 문자열이 인쇄됩니다.즉, 문자열은 이 b'your_string'과 같습니다.이 문제를 해결하려면 다음 코드 행을 추가하십시오.

encoded_string= base64.b64encode(img_file.read())
print(encoded_string.decode('utf-8'))

이미지를 Base64 문자열로 변환하는 동안 이런 일이 있었습니다.거기서 그걸 어떻게 제거했는지도 보실 수 있습니다.링크는 base64 문자열에 대한 이미지 및 프리픽스에서 'b'를 수정합니다.

import base64
from PIL import Image
from io import BytesIO

with open("image.jpg", "rb") as image_file:
    data = base64.b64encode(image_file.read())

im = Image.open(BytesIO(base64.b64decode(data)))
im.save('image1.png', 'PNG')

Ivo van der Wijkgnibbler가 이전에 개발한 것을 차용하여 역동적인 솔루션입니다.

import cStringIO
import PIL.Image

image_data = None

def imagetopy(image, output_file):
    with open(image, 'rb') as fin:
        image_data = fin.read()

    with open(output_file, 'w') as fout:
        fout.write('image_data = '+ repr(image_data))

def pytoimage(pyfile):
    pymodule = __import__(pyfile)
    img = PIL.Image.open(cStringIO.StringIO(pymodule.image_data))
    img.show()

if __name__ == '__main__':
    imagetopy('spot.png', 'wishes.py')
    pytoimage('wishes')

그런 다음 Cython을 사용하여 출력 이미지 파일을 컴파일하여 냉각할 수 있습니다.이 방법을 사용하면 모든 그래픽을 하나의 모듈에 번들할 수 있습니다.

이전 질문에서 말씀드린 바와 같이, base64 인코딩은 필요 없습니다.프로그램이 느려질 뿐입니다.그냥 repr을 사용하세요.

>>> with open("images/image.gif", "rb") as fin:
...  image_data=fin.read()
...
>>> with open("image.py","wb") as fout:
...  fout.write("image_data="+repr(image_data))
...

이제 이미지는 다음과 같은 변수로 저장됩니다.image_data라는 파일로image.py새로운 인터프리터를 기동하여 image_data를 Import합니다.

>>> from image import image_data
>>>

나에겐 효과가 있다

import base64
import requests

# Getting image in bytes
response = requests.get("image_url") 

# image encoding
encoded_image = base64.b64encode(response.content)

# image decoding and without it's won't work due to some '\xff' error
decoded_image= base64.b64decode(encoded_image)

언급URL : https://stackoverflow.com/questions/3715493/encoding-an-image-file-with-base64

반응형