将它保存为字符串对象后解码Base64?

时间:2018-04-02 21:49:12

标签: python string tkinter base64 photoimage

我是Python的新手,我正在尝试编译一个文本(.txt)文档,该文档充当保存文件,可以在以后加载。

我希望它是一个独立的文档,其中包含用户正在使用的所有属性(包括我希望在文件中保存为编码的base64二进制字符串的一些图像)。

我已经编写了程序并且它正确地将所有内容保存到文本文件中(尽管我必须通过str()传递编码值)但是我以后无法访问图像进行解码。以下是我创建文本信息的示例:

if os.path.isfile("example.png"): #if the user has created this type of image..  
    with open("example.png", "rb") as image_file:
        image_data_base64_encoded_string = base64.b64encode(image_file.read())
        f = open("example_save.txt",'a+')
        f.write("str(image_data_base64_encoded_string)+"\n")
        f.close() #save its information to the text doc

以下是我尝试重新访问此信息的一个例子。

master.filename =  filedialog.askopenfilename(initialdir = "/",title = "Select file",filetypes = ((".txt files","*.txt"),("all files","*.*")))
with open(master.filename) as f:
    image_import = ((f.readlines()[3]))#pulling the specific line the data string is in

image_imported = tk.PhotoImage(data=image_import)

这只是我最近的许多尝试 - 仍然会返回错误。我尝试在传递给tkinter PhotoImage函数之前对编码信息进行解码,但我认为Python可能会将编码信息视为字符串(因为我在保存信息时将其设置为一个)但我不知道如何更改它改变信息。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

当您写出这样的值时:

str(image_data_base64_encoded_string)

编写如下:

b'...blah...'

查看您正在撰写的文件,您会发现该行被b' '包围。

您希望将二进制文件解码为适合您文件的编码,例如:

f.write(image_data_base64_encoded_string.decode('utf-8') + "\n")

答案 1 :(得分:0)

我建议使用Pillow模块处理图像,但如果您坚持当前的方式,请尝试以下代码:

from tkinter import *
import base64
import os

if os.path.isfile("example.png"): #if the user has created this type of image..  
    with open("example.png", "rb") as image_file:
        image_data_base64_encoded_string = base64.b64encode(image_file.read())
        f = open("example_save.txt",'a+')
       f.write(image_data_base64_encoded_string.decode("utf-8")+"\n")
       f.close() 

filename =  filedialog.askopenfilename(initialdir = "/",title = "Select file",filetypes = ((".txt files","*.txt"),("all files","*.*")))
with open(filename) as f:
    image_import = f.readlines()[3].strip()
image_imported = PhotoImage(data=image_import)

您看到您的字符串需要为utf-8,并且尾随的换行符也阻止PhotoImage()将图像数据解释为图像。