我想使用base64模块将图像编码为字符串。不过我遇到了一个问题。如何指定我想要编码的图像?我尝试将目录用于图像,但这只会导致目录被编码。我希望对实际的图像文件进行编码。

EDIT

我试了一下这个片段:

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

其他回答

正如我在你之前的问题中所说,没有必要对字符串进行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

>>> from image import image_data
>>>
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')

我不太明白你的问题。我猜你正在做的事情是:

import base64

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

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

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

首先,记住在Windows上使用路径分隔符时使用原始字符串(字符串前缀为'r'),以防止意外地碰到转义字符。第二,PIL的形象。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()

这是我的工作

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)

第一个答案将打印一个以b'为前缀的字符串。 这意味着你的字符串将像这样的b'your_string'要解决这个问题,请添加下面的代码行。

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

我在将图像转换为Base64字符串时遇到过这种情况。你可以看看我是怎么把它移走的。链接是在这里Image到base64字符串和修复'b从前缀