用base64编码图像文件

251 投票
6 回答
486257 浏览
提问于 2025-04-16 04:10

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

我哪里做错了呢?

6 个回答

59

直接使用 base64.b64encode(img_file.read()) 会返回字节数据。也就是说,你得到的结果看起来像 b'your_string'。要解决这个问题,你需要像这样进行解码:

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

我在把图片转换成Base64字符串的时候遇到过这个问题。你可以看看我是怎么解决的。这里有个链接 将图片转换为Base64字符串并修复'b前缀的问题

67

在编程中,有时候我们会遇到一些问题,想要找到解决办法。StackOverflow是一个很棒的地方,大家可以在这里提问和回答问题。你可以把它想象成一个大型的问答社区,里面有很多热心的程序员,他们会分享自己的经验和知识。

当你在StackOverflow上提问时,记得描述清楚你遇到的问题,提供一些相关的代码和错误信息,这样其他人才能更好地理解你的情况,给出有效的帮助。

如果你看到别人提问,觉得他们的问题和你遇到的类似,可以看看有没有人已经回答了,或者你也可以参与讨论,分享你的看法和解决方案。

总之,StackOverflow是一个学习和交流的好地方,适合所有想要提升编程技能的人。

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')

449

我不太明白你的问题。我猜你的意思是:

import base64

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

当然,你得先打开文件,然后读取里面的内容——你不能直接把文件路径传给编码函数。

编辑:好的,这是在你修改了原问题后的更新。

首先,记得在Windows上使用路径分隔符时,要用原始字符串(在字符串前加'r'),这样可以避免不小心触发转义字符。其次,PIL的Image.open函数可以接受文件名,或者是一个类似文件的对象(也就是说,这个对象必须提供读取、定位和获取当前位置的方法)。

话说回来,你可以用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()

撰写回答