55

我想对 PNG 文件进行 base-64 编码,以将其包含在我的样式表中的 data:url 中。我怎样才能做到这一点?

我在 Mac 上,所以 Unix 命令行上的东西会很好用。基于 Python 的解决方案也将是宏大的。

4

7 回答 7

71

这应该在 Python 中完成:

import base64
encoded = base64.b64encode(open("filename.png", "rb").read())
于 2011-06-16T17:20:40.963 回答
47

在 python3 中,base64.b64encode返回一个实例,因此如果您正在使用 unicode 文本,则bytes需要调用decode以获取 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('ascii')
>>> 'data:image/png;base64,{}'.format(encoded)
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='

如果您直接使用,则无需进一步解码bytes即可使用输出。base64.b64encode

>>> encoded = base64.b64encode(image_data)
>>> b'data:image/png;base64,' + encoded
b'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='
于 2018-03-25T11:09:48.823 回答
15
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')
于 2018-12-09T01:06:15.623 回答
4

这应该在Unix中执行:

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

生成的编码图像b64encode包括页眉和页脚,并且行长不超过 76 个字符。这种格式在 SMTP 通信中很常见。

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

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

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

或在CSS

url(data:image/png;base64,ENCODED_PNG)
于 2013-12-09T09:58:24.607 回答
1

b64encode 在某些发行版中默认未安装(@Clint Pachl 的回答),但 python 是。

所以,只需使用:

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

为了从命令行获取 base64 编码的图像。

@Clint Pachl 已经回答了其余步骤(https://stackoverflow.com/a/20467682/1522342

于 2018-05-13T12:00:59.600 回答
1

这应该在 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

调用 decode 以获取 str ,如 python3 base64.b64encode 返回一个字节实例。

于 2020-07-26T14:58:53.290 回答
0

仅作记录,如果您想在 Node.js 中执行此操作:

const fs = require('fs');
const base64encodedString = fs.readFileSync('image_file.jpg', {encoding:'base64'});
于 2021-06-22T10:57:11.600 回答