用base64编码图像文件

2024-04-25 23:45:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用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

我做错什么了?


Tags: inpy图像imageself目录编码line
3条回答

我不太明白你的问题。我想你做的事情大致如下:

import base64

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

当然,首先必须打开文件并读取其内容—不能简单地将路径传递给encode函数。

编辑: 好的,这是您编辑完原始问题后的更新。

首先,在Windows上使用路径分隔符时,请记住使用原始字符串(在字符串前面加上'r'),以防止意外碰到转义字符。其次,PIL的Image.open要么接受一个文件名,要么接受类似的文件(即,对象必须提供read、seek和tell方法)。

也就是说,您可以使用cStringIO从内存缓冲区创建这样一个对象:

import cStringIO
import PIL.Image

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

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

正如我在前一个问题中所说,不需要base64编码字符串,它只会使程序变慢。就用这个代表

>>> 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的文件中 启动新的解释器并导入图像数据

>>> from image import image_data
>>>

使用Python2.x,您可以使用.encode进行简单的编码:

with open("path/to/file.png", "rb") as f:
    data = f.read()
    print data.encode("base64")

相关问题 更多 >