How do you base-64 encode a PNG image for use in a data-uri in a CSS file?

前端 未结 6 1165
孤独总比滥情好
孤独总比滥情好 2020-11-28 06:47

I want to base-64 encode a PNG file, to include it in a data:url in my stylesheet. How can I do that?

I’m on a Mac, so something on the Unix command line would work

相关标签:
6条回答
  • 2020-11-28 07:07

    This should do it in Python:

    import base64
    encoded = base64.b64encode(open("filename.png", "rb").read())
    
    0 讨论(0)
  • 2020-11-28 07:07

    This should do it in Unix:

    b64encode filename.png X | sed '1d;$d' | tr -d '\n' > b64encoded.png
    

    The encoded image produced by b64encode includes a header and footer and no line longer than 76 characters. This format is typical in SMTP communications.

    To make the encoded image embeddable in HTML/CSS, the sed and tr commands remove the header/footer (first & last lines) and all newlines, respectively.

    Then just simply use the long encoded string in HTML

    <img src="data:image/png;base64,ENCODED_PNG">
    

    or in CSS

    url(data:image/png;base64,ENCODED_PNG)
    
    0 讨论(0)
  • 2020-11-28 07:09

    In python3, base64.b64encode returns a bytes instance, so it's necessary to call decode to get a str, if you are working with unicode text.

    # Image data from [Wikipedia][1]
    >>>image_data = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x05\x00\x00\x00\x05\x08\x06\x00\x00\x00\x8do&\xe5\x00\x00\x00\x1cIDAT\x08\xd7c\xf8\xff\xff?\xc3\x7f\x06 \x05\xc3 \x12\x84\xd01\xf1\x82X\xcd\x04\x00\x0e\xf55\xcb\xd1\x8e\x0e\x1f\x00\x00\x00\x00IEND\xaeB`\x82'
    
    # String representation of bytes object includes leading "b" and quotes,  
    # making the uri invalid.
    >>> encoded = base64.b64encode(image_data) # Creates a bytes object
    >>> 'data:image/png;base64,{}'.format(encoded)
    "data:image/png;base64,b'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='"
    
    
    # Calling .decode() gets us the right representation
    >>> encoded = base64.b64encode(image_data).decode()
    >>> 'data:image/png;base64,{}'.format(encoded)
    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='
    

    If you are working with bytes directly, you can use the output of base64.b64encode without further decoding.

    >>> encoded = base64.b64encode(image_data)
    >>> b'data:image/png;base64,' + encoded
    b'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='
    
    0 讨论(0)
  • 2020-11-28 07:16

    This should work in Python3:

    from io import BytesIO
    import requests, base64
    
    def encode_image(image_url):
        buffered = BytesIO(requests.get(image_url).content)
        image_base64 = base64.b64encode(buffered.getvalue())
        return b'data:image/png;base64,'+image_base64
    
    

    Call decode to get str as in python3 base64.b64encode returns a bytes instance.

    0 讨论(0)
  • 2020-11-28 07:18

    b64encode is not installed by default in some distros (@Clint Pachl's answer), but python is.

    So, just use:

    python -mbase64 image.jpeg | tr -d '\n' > b64encoded.txt

    In order to get base64 encoded image from the command line.

    The remaining steps were already answered by @Clint Pachl (https://stackoverflow.com/a/20467682/1522342)

    0 讨论(0)
  • 2020-11-28 07:22
    import base64
    
    def image_to_data_url(filename):
        ext = filename.split('.')[-1]
        prefix = f'data:image/{ext};base64,'
        with open(filename, 'rb') as f:
            img = f.read()
        return prefix + base64.b64encode(img).decode('utf-8')
    
    0 讨论(0)
提交回复
热议问题