Python 批量图片转 base64:内嵌图片到 HTML/CSS 教程
用 Python 把本地图片批量转成 base64 字符串,生成 data URI,方便内嵌到 HTML、邮件、JSON 接口里,附完整代码和大小注意事项。
场景痛点
做单个 HTML 邮件、写 Markdown 文档、调接口传图片时,不想把图片单独存服务器,希望图片直接内嵌在文件里。一张张手动去在线工具转 base64,复制粘贴,几十张图就废了。用 Python 批量把目录下图片转成 base64,直接生成 data:image/png;base64,xxxx 字符串,写进 HTML 或 JSON 一行搞定。
用到的库
# 标准库,不需要安装
# base64, os, json
完整代码
import os
import base64
import json
SRC_EXTS = {
".jpg": "image/jpeg",
".jpeg": "image/jpeg",
".png": "image/png",
".gif": "image/gif",
".webp": "image/webp",
}
def image_to_base64(path):
"""把图片文件读成 base64 编码的 data URI"""
ext = os.path.splitext(path)[1].lower()
mime = SRC_EXTS.get(ext)
if not mime:
raise ValueError(f"不支持的格式:{ext}")
with open(path, "rb") as f:
b64 = base64.b64encode(f.read()).decode("ascii")
return f"data:{mime};base64,{b64}"
def batch_to_json(src_dir, out_json):
"""批量把图片转成 base64,输出成 {文件名: dataURI} 的 JSON"""
result = {}
for root, _, files in os.walk(src_dir):
for name in files:
ext = os.path.splitext(name)[1].lower()
if ext not in SRC_EXTS:
continue
path = os.path.join(root, name)
try:
result[name] = image_to_base64(path)
print(f"已转换:{name}")
except Exception as e:
print(f"失败:{name},原因:{e}")
with open(out_json, "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False, indent=2)
print(f"共 {len(result)} 张,写入 {out_json}")
def generate_html(src_dir, out_html):
"""批量转 base64 并生成一个内嵌所有图的 HTML 预览页"""
with open(out_html, "w", encoding="utf-8") as f:
f.write("<html><body style='font-family:sans-serif'>\n")
for root, _, files in os.walk(src_dir):
for name in sorted(files):
ext = os.path.splitext(name)[1].lower()
if ext not in SRC_EXTS:
continue
path = os.path.join(root, name)
try:
data_uri = image_to_base64(path)
except Exception as e:
f.write(f"<p>{name} 转换失败:{e}</p>\n")
continue
f.write(f"<h3>{name}</h3>\n")
f.write(f'<img src="{data_uri}" style="max-width:500px"><br><br>\n')
f.write("</body></html>\n")
print(f"HTML 已生成:{out_html}")
def main():
batch_to_json("./icons", "./icons_b64.json")
generate_html("./icons", "./preview.html")
if __name__ == "__main__":
main()
代码讲解
base64.b64encode把二进制字节转成 base64 字节,再.decode("ascii")转成字符串,因为 base64 本身就是 ASCII。- data URI 格式是
data:MIME类型;base64,编码内容,MIME 类型根据扩展名查,png 对应image/png,jpg 对应image/jpeg。 - JSON 输出用
ensure_ascii=False,文件名带中文时不会被转义成\uXXXX,可读性好。 generate_html直接生成一个单文件 HTML,<img src>里就是 data URI,双击打开离线能看图,适合做邮件、原型展示。
运行结果
运行后生成 ./icons_b64.json,里面是 {"图标1.png": "data:image/png;base64,...", ...};同时生成 ./preview.html,浏览器打开能看到所有图内嵌渲染。把 JSON 里的值直接复制到代码里就能用。
注意事项
- base64 编码后体积比原文件大约大 33%,大图转 base64 会让 HTML/JSON 变得臃肿,单张图超过 500KB 就别内嵌了。
- 接口传 base64 时,注意服务端请求体大小限制,Nginx 默认 1MB,要改
client_max_body_size。 - 邮件里嵌图片用 base64 是标准做法,但邮件客户端对超大内嵌图会被拦,控制在 200KB 以内。
- GIF 动图转 base64 能保留动画,Pillow 不参与处理,直接读二进制即可。
- base64 不是加密,只是编码,别人复制出来一解码就是原图,别拿来保密。

更新时间:2026-09-14 20:37:35