首页 > 解决方案 > 如果文件系统中不存在,我如何将图像保存在代码中(通过 pickle、dill 或其他字节码)并保存到文件?

问题描述

如果文件系统中不存在,我如何将图像保存在代码中(通过 pickle、dill 或其他字节码)并保存到文件?蟒蛇 3.6.5。

为了让 Tkinter 应用程序正常工作,我需要出示两张照片。它们可能会或可能不会一直出现在设备上,因此我需要根据需要创建它们。但是,我无法弄清楚如何做到这一点,但不会损坏文件。有什么建议么?

当前代码:

with open("0.png", 'rb') as f:
    temp = f.read()
    CogFile = pickle.dumps(temp, pickle.HIGHEST_PROTOCOL)
    print(FileData)
    pickle.dump(FileData, open("1.png", 'wb'), pickle.HIGHEST_PROTOCOL)

with open("0.gif", 'rb') as F:
    temp = F.read()
    CogFile = pickle.dumps(temp, pickle.HIGHEST_PROTOCOL)
    print(FileData)
    pickle.dump(FileData, open("1.gif", 'wb'), pickle.HIGHEST_PROTOCOL)

标签: python-3.ximagepicklebytecodedill

解决方案


您可以将图像嵌入到 python 文件中。为此,默认图像位需要采用符合 .py 文件语法的非二进制格式。这是一个编码器文件,您可以运行一次,然后将结果作为变量粘贴到 .py 文件中。它执行 base64 编码以将二进制文件转换为 ascii 并将所有内容包装在 pythonbytes对象中。

import sys
import base64

try:
    var = sys.argv[1]
    fn = sys.argv[2]
    with open(fn, 'rb') as fp:
        print(var, '= b"""\\')
        for line in base64.encodebytes(fp.read()).split(b'\n'):
            if line:
                print(line.decode('ascii'))
        print('"""')
except (IndexError, OSError):
    print("usage: pyencode.py variable_name file_to_encode")

举个例子

$ python3 pyencoder.py dft_png stackoverlow.png 
dft_png = b"""\
iVBORw0KGgoAAAANSUhEUgAAAGkAAABpCAMAAAAOXP0IAAAAe1BMVEX////0gCS8u7u5uLjNzMzy
8vL6z7j0eQf0eg/5v6Dk5OTZ2dn0fh/0fRvzdQD//PnCwcH+9/P83cj+9e396971j0P3nVv3o2f9
5tb4soL82sH4rnr6yKb5u5T1jDv0hCnzbwD2lk/6y673p2771Lf5uo31iy71iDP5wZrUFssbAAAC
yElEQVRoge2XW4OaMBCFjXY3s2vGFMJVEASh8P9/YUnCRdu662ri9iHnTYF8JGfOJKxWTk5OTk5O
Tk6T8uQ5HHHaVd4zQEkFBNongGqKhBBs7JMSxgYS6wL7qEbOiWD0BKsyUKgnWOVValZ0bx/ll8qq
wpZV3jKHmmqruB3SAdppZK6tgt4KKKeMxmL8IUJlFbORKuUNVpM1U6rEhw/dI4E6ReVkVo6WrPJS
YGq9SD7+c9KpsmBVjhoFqZ6GGFPlm0c1nRqawEmb4xNlVWghVXK7UKhKb4S9ShXEFlIlYo3CQi0Z
P+n1s5EqPtUFVXWhU8WIBauWukDVL3zUDdBQqoKLnr0f60L3C50qU1ZlGDVnIyW6ERFURRcbTFVA
GdKqXhZInKhGdfvJKohMkFL51ohhP+/mXotLv9izybRHFXRq1KE3lP2c0fN+0e8KM5tvzXSG5Lhd
OrH2S7/grakmkWSoQyRZkI3ZmfuF0WYUpN3EIkhiX5ky9gsMzR7Ggr6gM4vqouftgLdwwBR5qPdC
VYhVLWeSM0QbjcirIzqxGC16IXf8/PPn7hH3IzKzoGjFSlg6hg3yM1gK0eR52auF98drB9lciHAw
R2qOtDi9NckFLTiUYPzDpoWhqQHrwrhPxBIc0YdDO4LUHGgV6wJgA46yKK39+Qxbh5QanJIIp7iq
GAGQokqbQFnHG5PfTz4AsnOYnB3V1hnErOR3TBuHHQKSCw1riV2RmT6Si+T1EJW7vyaH1aMjv/+U
2l78x70gz6qCAC40zOSVrbr7/T7SZr1eb7b/uBLs62youBEHquVt1d2mSVJcSOvKwahdYJekJPzB
ul/eE0hnMkTih7cPxE2SjnBdR5Orx3fkunaO9AnpSK/LqE+r+vW6apO1d4Mc6ZtJL7fpYdJ6c6vW
j5K+JEc6I31d95Fefnxd95GcnJycnJycnP4j/QYzhDnIDHrHXQAAAABJRU5ErkJggg==
"""

一旦粘贴到程序中,解码将是

import base64

dft_png = b"""\
iVBORw0KGgoAAAANSUhEUgAAAGkAAABpCAMAAAAOXP0IAAAAe1BMVEX////0gCS8u7u5uLjNzMzy
8vL6z7j0eQf0eg/5v6Dk5OTZ2dn0fh/0fRvzdQD//PnCwcH+9/P83cj+9e396971j0P3nVv3o2f9
5tb4soL82sH4rnr6yKb5u5T1jDv0hCnzbwD2lk/6y673p2771Lf5uo31iy71iDP5wZrUFssbAAAC
yElEQVRoge2XW4OaMBCFjXY3s2vGFMJVEASh8P9/YUnCRdu662ri9iHnTYF8JGfOJKxWTk5OTk5O
Tk6T8uQ5HHHaVd4zQEkFBNongGqKhBBs7JMSxgYS6wL7qEbOiWD0BKsyUKgnWOVValZ0bx/ll8qq
wpZV3jKHmmqruB3SAdppZK6tgt4KKKeMxmL8IUJlFbORKuUNVpM1U6rEhw/dI4E6ReVkVo6WrPJS
YGq9SD7+c9KpsmBVjhoFqZ6GGFPlm0c1nRqawEmb4xNlVWghVXK7UKhKb4S9ShXEFlIlYo3CQi0Z
P+n1s5EqPtUFVXWhU8WIBauWukDVL3zUDdBQqoKLnr0f60L3C50qU1ZlGDVnIyW6ERFURRcbTFVA
GdKqXhZInKhGdfvJKohMkFL51ohhP+/mXotLv9izybRHFXRq1KE3lP2c0fN+0e8KM5tvzXSG5Lhd
OrH2S7/grakmkWSoQyRZkI3ZmfuF0WYUpN3EIkhiX5ky9gsMzR7Ggr6gM4vqouftgLdwwBR5qPdC
VYhVLWeSM0QbjcirIzqxGC16IXf8/PPn7hH3IzKzoGjFSlg6hg3yM1gK0eR52auF98drB9lciHAw
R2qOtDi9NckFLTiUYPzDpoWhqQHrwrhPxBIc0YdDO4LUHGgV6wJgA46yKK39+Qxbh5QanJIIp7iq
GAGQokqbQFnHG5PfTz4AsnOYnB3V1hnErOR3TBuHHQKSCw1riV2RmT6Si+T1EJW7vyaH1aMjv/+U
2l78x70gz6qCAC40zOSVrbr7/T7SZr1eb7b/uBLs62youBEHquVt1d2mSVJcSOvKwahdYJekJPzB
ul/eE0hnMkTih7cPxE2SjnBdR5Orx3fkunaO9AnpSK/LqE+r+vW6apO1d4Mc6ZtJL7fpYdJ6c6vW
j5K+JEc6I31d95Fefnxd95GcnJycnJycnP4j/QYzhDnIDHrHXQAAAABJRU5ErkJggg==
"""

with open('1.png', 'wb') as fp:
    fp.write(base64.decodebytes(dft_png))

推荐阅读