Python3.6.5下如何用pickle/dill保存图片至不存在文件且避免损坏
嘿,我看到你现在的问题了——用pickle处理图片二进制数据导致文件损坏,这其实是找错工具啦!pickle是用来序列化Python对象的,不是直接处理原始二进制文件的,它会给数据加上额外的序列化元数据,这就是图片打不开的核心原因。
下面给你一套靠谱的解决方案,核心思路是把图片的原始二进制数据直接嵌入到代码里,当检测到文件缺失时,直接把原始数据写入文件,这样生成的文件和原图片完全一致:
第一步:把原始图片转成可嵌入代码的格式
先运行这个小脚本,把你的0.png和0.gif转换成base64编码字符串(这种格式方便在代码里存储,不会有转义问题):
import base64 # 读取原始图片并生成base64字符串 with open("0.png", "rb") as f: png_base64 = base64.b64encode(f.read()).decode("utf-8") with open("0.gif", "rb") as f: gif_base64 = base64.b64encode(f.read()).decode("utf-8") # 把打印出来的字符串复制到你的APP代码里 print("PNG_BASE64 =", repr(png_base64)) print("GIF_BASE64 =", repr(gif_base64))
第二步:在Tkinter应用中添加按需创建逻辑
把上面生成的base64字符串复制到你的应用代码里,再添加一个检查并创建图片的函数:
import os import base64 from tkinter import Tk, PhotoImage # 替换成刚才生成的base64字符串 PNG_BASE64 = "这里放你的png base64字符串" GIF_BASE64 = "这里放你的gif base64字符串" def ensure_image_exists(file_path, base64_data): # 如果文件不存在,就创建它 if not os.path.isfile(file_path): with open(file_path, "wb") as f: # 解码base64,还原成原始二进制数据写入文件 f.write(base64.b64decode(base64_data)) print(f"自动创建缺失的图片: {file_path}") # 确保两张图片都存在 ensure_image_exists("0.png", PNG_BASE64) ensure_image_exists("0.gif", GIF_BASE64) # 接下来正常加载图片就行 root = Tk() png_img = PhotoImage(file="0.png") gif_img = PhotoImage(file="0.gif") # 你的UI逻辑...
为什么这个方法可行?
我们直接操作图片的原始二进制数据,没有添加任何额外的序列化信息,生成的文件和你最初的图片完全一样,自然不会损坏。而且把图片数据嵌入到代码里,你的APP可以独立运行,不需要额外携带图片文件,只要检测到文件缺失就自动生成,完全满足你的"按需创建"需求。
再回头说你原来的代码问题:pickle序列化二进制数据时,会在原始数据外面加上Python对象的类型标记、长度信息等元数据,比如你把b"test"用pickle序列化后,得到的是b'\x80\x04\x95\x04\x00\x00\x00\x00\x00\x00\x00C\x04test\x94.',这些额外的字节会让图片解析器无法识别文件格式,导致损坏。所以处理纯二进制文件,直接读写就好,别用pickle~
内容的提问来源于stack exchange,提问作者Jakar510
相关产品推荐
相关产品推荐

