每次本地写好markdown格式的文档后,想要将它上传到博客网站上,但是本地的图片无法直接复制到网站的博客页面,每个图片需要重新点击上传,然后上传本地文件。其实也可以买一个图床解决,奈何囊中羞涩,并且还是不想将图片保存到别人的服务器。于是,想通过 markdown文档插入base64图片的方法,完成方便地进行博文上传。
因此,想要实现功能:
要实现上述功能,存在几个问题:
以下面两种方法来解决:
针对base64编码太长了,不利于博文观看的问题。
base64编码太长了,导致文本内容极大
综上所述,我要实现的是:
通过一个python程序将 本地的markdown文件及文件关联的本地图片, 生成一个新的只有 base64 编码的markdown文件(观看效果与原文件相同,且完全不依赖原文件).
通过正则表达式搜索源文件中的图片格式,然后替换成base64的格式,base64编码在文件最后追加,并保存为新文件。
引入依赖包
from PIL import Image
import os
import base64
import re
函数: 图片转base64
#将地址为address的图片转为base64字符串
def phtot_base64(address):
with open(address,"rb") as photo:
pb=base64.b64encode(photo.read())
return str(pb)[2:-1]
函数:获得文件的大小(单位kb)
# 获取文件大小:KB
def get_size(file):
size = os.path.getsize(file)
return size / 1024
函数:压缩图像
def compress_image(infile_path, outfile_path, aim_size, step=10, quality=80):
"""不改变图片尺寸压缩到指定大小
:param infile: 压缩源文件
:param outfile: 压缩文件保存地址
:param aim_size: 压缩目标,KB
:param step: 每次调整的压缩比率
:param quality: 初始压缩比率
:return: 压缩文件地址,压缩文件大小
"""
o_size = get_size(infile_path)
# 如果当前图片大小小于压缩目标大小
if o_size <= aim_size:
im = Image.open(infile_path)
im = im.convert('RGB') # 为了存成jpg文件,将图像转成rgb
im.save(outfile_path, quality=quality) # 保存压缩后的图像
print("图片已被压缩!")
return infile_path
# 如果当前图片大小大于压缩目标大小
while o_size > aim_size:
im = Image.open(infile_path)
im = im.convert('RGB') # 为了存成jpg文件,将图像转成rgb
im.save(outfile_path, quality=quality) # 保存压缩后的图像
if quality - step < 0:
break
quality -= step
o_size = get_size(outfile_path)
print("图片已被压缩!")
return outfile_path
文件目录如下:
我们现在对【test.md】进行格式转化。pic文件夹中有图片如下,且已经被【test.md】引用:
执行【img_to_base64.py】!!!,需要输入原始markdown路径,及希望压缩图片到多大。运行及打印结果如下:
(base) PS E:\mydoc\done\2021\summer\md_img2base64_project\tests> python .\img_to_base64.py
******************************
请输入目标markdown文件地址:
"E:\mydoc\done\2021\summer\md_img2base64_project\tests\test.md"
******************************
******************************
请输入压缩图片允许最大体积(单位:KB): 100
******************************
******************************
图片:【pic/image-20210422132634431.png】被读取!
原始图像base64文本长度为:28816
图片已被压缩!
压缩图像base64文本长度为:28816
******************************
******************************
图片:【pic/image-20210422132812199.png】被读取!
原始图像base64文本长度为:233024
图片已被压缩!
压缩图像base64文本长度为:21488
******************************
******************************
文件图片转换成功!
******************************
请按任意键继续. . .
之后文件目录编程这样:
【对比两个markdown文本】:
原文件:
![image-20210422132634431](pic/image-20210422132634431.png)
阿斯顿发撒打发
### 方法士大夫
/撒大大
$\sigma$
![image-20210422132812199](pic/image-20210422132812199.png)
转换后文件:
![image-20210422132634431][Fig1]
阿斯顿发撒打发
### 方法士大夫
/撒大大
$\sigma$
![image-20210422132812199][Fig2]
****************************************************************************************************
****************************************************************************************************
****************************************************************************************************
[Fig1]:data:image/png;base64,iVBORw0KGgoAAAANSUhE...(省略)
[Fig2]:data:image/png;base64,iVBORw0KGgoAAAANSUhE...(省略)
完美解决,从此告别图床服务器!
我还将该程序打包为可执行的exe文件,只要将文件放到markdown文件所在目录即可。
文件夹名 | 文件夹介绍 | 备注 |
---|---|---|
build | pyinstaller生成的build文件 | |
dist | pyinstaller生成的distribution文件 | |
md_img2base64 | virtualenv生成的虚拟环境 | |
src | 源代码 | |
tests | 测试时使用的文件 | |
pic | readme文件的图片 |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。