Search code examples
python-3.ximagepicklebytecodedill

How can I save an image in code (via pickle, dill, or other bytecode) and save to file if not exist in a file system?


How can I save an image in code (via pickle, dill, or other bytecode) and save to file if not exist in a file system? Python 3.6.5.

There are two photos that I need to be present for the Tkinter app to work. they may or may not be present at all times on the device, so I need to create them as needed. However, I can't figure out how to do it yet that doesn't corrupt the file. Any suggestions?

Current code:

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)

Solution

  • You could embed the images in a python file. To do that, the default image bits will need to be in a non-binary format that fits syntactically into the .py file. Here is an encoder file that you can run once and then paste the results into a .py file as a variable. It does a base64 encode to convert the binary file into acscii and wraps that all in a python bytes object.

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

    As an example

    $ 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==
    """
    

    Once pasted into a program the decoding would be

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