你如何base-64编码PNG图像用于CSS文件中的数据uri?

Pau*_*ite 42 css python base64 image data-uri

我想base-64编码PNG文件,将其包含在我的样式表中的数据:url中.我怎样才能做到这一点?

我在Mac上,所以Unix命令行上的东西会很好用.基于Python的解决方案也很棒.

Jon*_*Jon 56

这应该在Python中完成:

import base64
encoded = base64.b64encode(open("filename.png", "rb").read())
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的,但结果字符串还应该加上""data:image/png; base64,"` - 上面的代码本身并没有这样做. (8认同)
  • @PaulD.Waite:那些'\n'肯定看起来不合适. (3认同)

sna*_*erb 17

在python3中,base64.b64encode返回一个bytes实例,因此如果您正在使用unicode文本,则需要调用decodeget a str.

# 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=='
Run Code Online (Sandbox Code Playgroud)

如果您正在bytes直接使用,则可以使用输出而base64.b64encode无需进一步解码.

>>> encoded = base64.b64encode(image_data)
>>> b'data:image/png;base64,' + encoded
b'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你。这是我认为最好的答案。 (3认同)
  • 谢谢你 !!正要拔我的头发。decode() 救了我的头发 :) (2认同)

Cli*_*chl 5

这应该在Unix中完成:

b64encode filename.png X | sed '1d;$d' | tr -d '\n' > b64encoded.png
Run Code Online (Sandbox Code Playgroud)

生成的编码图像b64encode包括页眉和页脚,且行长度不超过 76 个字符。此格式是 SMTP 通信中的典型格式。

为了使编码图像可嵌入 HTML/CSS,sedtr命令分别删除页眉/页脚(第一行和最后一行)和所有换行符。

然后只需在HTML中使用长编码字符串即可

<img src="data:image/png;base64,ENCODED_PNG">
Run Code Online (Sandbox Code Playgroud)

或者在CSS中

url(data:image/png;base64,ENCODED_PNG)
Run Code Online (Sandbox Code Playgroud)


Ram*_*lat 5

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')
Run Code Online (Sandbox Code Playgroud)