我的知识记录

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 不是加密,只是编码,别人复制出来一解码就是原图,别拿来保密。

Python 批量图片转 base64:内嵌图片到 HTML/CSS 教程

标签:

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

上一篇:Python 数字转中文大写金额:财务报销发票必备

下一篇:Python OCR 识别图片文字:pytesseract 中文识别教程