convert image to byte literal in python
Question: I'm trying to store an image as text, so that I can do something like this
example of a transparent icon for a Tk gui:

    
    
    import tempfile
    
    # byte literal code for a transparent icon, I think
    ICON = (b'\x00\x00\x01\x00\x01\x00\x10\x10\x00\x00\x01\x00\x08\x00h\x05\x00\x00'
            b'\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\x00\x01\x00'
            b'\x08\x00\x00\x00\x00\x00@\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
            b'\x00\x01\x00\x00\x00\x01') + b'\x00'*1282 + b'\xff'*64
    
    # makes a temp file for the transparent icon and saves it
    _, ICON_PATH = tempfile.mkstemp()
    with open(ICON_PATH, 'wb') as icon_file:
        icon_file.write(ICON)
    

I've tried base 64 encoding, decoding with utf8, converting to bytes and
bytearray, and some answers from another post: ([Python Script to convert
Image into Byte array](http://stackoverflow.com/questions/22351254/python-
script-to-convert-image-into-byte-array))

    
    
    import tempfile, base64, io
    
    # byte literal code for a transparent icon, I think
    ICON = (b'\x00\x00\x01\x00\x01\x00\x10\x10\x00\x00\x01\x00\x08\x00h\x05\x00\x00'
            b'\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\x00\x01\x00'
            b'\x08\x00\x00\x00\x00\x00@\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
            b'\x00\x01\x00\x00\x00\x01') + b'\x00'*1282 + b'\xff'*64
    
    # makes a temp file for the transparent icon and saves it
    _, ICON_PATH = tempfile.mkstemp()
    with open(ICON_PATH, 'wb') as icon_file:
        icon_file.write(ICON)
    
    a = open(ICON_PATH, 'rb').read()
    
    b = base64.b64encode(a)
    
    print b # output does not match what ICON equals above
    
    #b = bytes(a).decode('utf-8') # doesn't work -- gives error UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 1342: invalid start byte
    
    c = bytearray(a)
    
    print c # prints garbled junk
    
    
    # gives error AttributeError: __exit__ on Image.open(ICON_PATH) line
    with io.BytesIO() as output:
        from PIL import Image
        with Image.open(ICON_PATH) as img:
            img.convert('RGB').save(output, 'BMP')                
        data = output.getvalue()[14:]
    
    print data
    

It also doesn't work for b.decode('utf-8') or b.encode('utf-8')


Answer: I think you're just not printing out the data properly -- there doesn't seem
to be any need to mess around with `base64` doing this.

Here's proof:

    
    
    from itertools import izip
    import tempfile
    
    # byte literal code for a transparent icon, I think
    ICON = (b'\x00\x00\x01\x00\x01\x00\x10\x10\x00\x00\x01\x00\x08\x00h\x05\x00\x00'
            b'\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\x00\x01\x00'
            b'\x08\x00\x00\x00\x00\x00@\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
            b'\x00\x01\x00\x00\x00\x01') + b'\x00'*1282 + b'\xff'*64
    
    # make a temp file from ICON data for testing
    _, ICON_PATH = tempfile.mkstemp()
    with open(ICON_PATH, 'wb') as icon_file:
        icon_file.write(ICON)
    
    # Convert raw data in the file into a valid Python string literal.
    
    # helper function
    def grouper(n, seq):
        "s -> (s0,s1,...sn-1), (sn,sn+1,...s2n-1), (s2n,s2n+1,...s3n-1), ..."
        for i in xrange(0, len(seq), n):
            yield seq[i:i+n]
    
    # read data file in binary mode
    a = open(ICON_PATH, 'rb').read()
    
    # create Python code to define string literal
    code = '\n'.join(['ICON2 = ('] +
                     ['    '+repr(group) for group in grouper(16, a)] +
                     [')'])
    
    print 'len(ICON): {}'.format(len(ICON))
    print 'len(a): {}'.format(len(a))
    print code
    exec(code)
    print
    print 'len(ICON2): {}'.format(len(ICON2))
    print 'ICON2 == ICON: {}'.format(ICON2 == ICON)
    

Output:

    
    
    len(ICON): 1406
    len(a): 1406
    ICON2 = (
        '\x00\x00\x01\x00\x01\x00\x10\x10\x00\x00\x01\x00\x08\x00h\x05'
        '\x00\x00\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00'
        '\x00\x00\x01\x00\x08\x00\x00\x00\x00\x00@\x05\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
           ...
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff'
        '\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
        '\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
        '\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
        '\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
    )
    
    len(ICON2): 1406
    ICON2 == ICON: True
    

