Python 使用base64编码图像文件

Python 使用base64编码图像文件,python,base64,Python,Base64,我想使用base64模块将图像编码为字符串。不过我遇到了一个问题。如何指定要编码的图像?我尝试使用目录来创建图像,但这只会导致目录被编码。我想对实际的图像文件进行编码 编辑 我试过这个片段: with open("C:\Python26\seriph1.BMP", "rb") as f: data12 = f.read() UU = data12.encode("base64") UUU = base64.b64decode(UU) print UUU

我想使用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
回溯(最近一次呼叫最后一次):
文件“”,第245行,在run_nodebug中
文件“C:\Python26\GUI1.2.9.py”,第473行,在
app=simpleapp_tk(无)
文件“C:\Python26\GUI1.2.9.py”,第14行,在\uuu init中__
self.initialize()
文件“C:\Python26\GUI1.2.9.py”,第431行,在初始化中
self.image=ImageTk.PhotoImage(image.open(UUU))
文件“C:\Python26\lib\site packages\PIL\Image.py”,第1952行,打开
fp=内置打开(fp,“rb”)
TypeError:file()参数1必须是不带空字节的编码字符串,而不是str

我做错了什么

我不太明白你的问题。我假设您正在按照以下思路进行操作:

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编码,它只会使程序变慢。只需使用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\u data
的变量存储在名为
image.py
启动一个新的解释器并导入图像数据

>>> from image import image_data
>>>
借鉴早期的经验,这是一个动态的解决方案

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

然后,您可以决定使用编译输出图像文件,使其更酷。使用此方法,您可以将所有图形捆绑到一个模块中。

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

encoded_string= base64.b64encode(img_file.read())
print(encoded_string.decode('utf-8'))
这是我的工作

导入base64
导入请求
#获取以字节为单位的图像
response=requests.get(“image\u url”)
#图像编码
encoded_image=base64.b64encode(response.content)
#由于某些“\xff”错误,图像解码和不解码将无法工作
解码的\u图像=base64.b64解码(编码的\u图像)

我真的不知道repr()在这里有什么用处。@Ivo,Anteater希望能够在python文件中存储图像。我要指出的是,使用base64会适得其反,因为每次加载模块时都需要对数据进行解码。相反,使用repr意味着文本字符串存储在.pyc文件中,可以立即使用,无需进一步修改processing@JohnLaRooy谢谢。我得到了
TypeError:需要一个类似字节的对象,而不是'fout.write('image\u data=“+repr(image\u data))行的'str'
。我如何解决这个问题?谢谢,还有一个问题,当我打印解码图像时,我得到了字符串“ÿØÿ”。然而,当我单独运行它作为数据的替代时,我会得到一个错误。编码的字符串要长得多,便于比较。所以我认为这可能存储了图像数据。解码后的字符串是否仅引用编码字符串或其他内容?对于数据存储来说,它似乎太短了。打印的输出不一定等于实际内容-这取决于打印的方式和位置。在我的情况下,我需要解码:
base64.b64encode(fh.read()).decode()
,以获取要在html文件中使用的字符串。base64.b64encode(fh.read())。decode()很微妙,但我也需要@qed,谢谢区别在于一个返回字节,另一个返回字符串。。。我的SOAP服务器不会在没有解码的情况下吞下它!这看起来是一个很好的答案,但如果目的是推广你的网站,请不要发帖。但是,欢迎您在您的个人资料中添加链接。(顺便说一句,此处不能依赖答案顺序,因此值得避免使用“第一个答案”之类的注释。第一个出现的答案可能会随着时间的推移而改变。
:-)
)在此答案的原始版本中,看起来您链接到了自己的网站或您的附属网站。如果你确实链接到这样一个网站,你必须披露这是你的网站。如果你不透露隶属关系,这被认为是垃圾邮件。见:和。披露必须明确,但不需要正式。当它是你自己的个人内容时,它可以是类似“在我的网站上…”、“在我的博客上…”等。感谢@Makyen的建议,我将披露它是我的网站。现在编辑答案以披露它是我的网站是否合法?或者我不应该编辑它。这个答案真的应该在顶部。。。最好的——谢谢!
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')