2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 本地markdown文件自动生成|图片批量压缩并转base64格式|告别图床服务器|博文神器

本地markdown文件自动生成|图片批量压缩并转base64格式|告别图床服务器|博文神器

时间:2019-07-21 15:24:38

相关推荐

本地markdown文件自动生成|图片批量压缩并转base64格式|告别图床服务器|博文神器

一、项目简介

问题来源

每次本地写好markdown格式的文档后,想要将它上传到博客网站上,但是本地的图片无法直接复制到网站的博客页面,每个图片需要重新点击上传,然后上传本地文件。其实也可以买一个图床解决,奈何囊中羞涩,并且还是不想将图片保存到别人的服务器。于是,想通过 markdown文档插入base64图片的方法,完成方便地进行博文上传。

目标功能、问题及解决方案

因此,想要实现功能:

将已有的markdown文本转化为插入了base64图片编码的markdown

要实现上述功能,存在几个问题:

base64编码太长了,不利于博文的观看base64编码太长了,导致文本内容极大

以下面两种方法来解决:

针对base64编码太长了,不利于博文观看的问题。

解决方法:将base64的编码都放到博文的末尾,这样就可以不影响博文编写模式下的观看。reference:base64的高级方法

base64编码太长了,导致文本内容极大

解决方法: 对图像大小进行压缩, 其相应的base64编码也会压缩(当然,也会牺牲图片的清晰度)

综上所述,我要实现的是:

通过一个python程序将 本地的markdown文件及文件关联的本地图片, 生成一个新的只有 base64 编码的markdown文件(观看效果与原文件相同,且完全不依赖原文件).

二、源程序思路简介

思路:

通过正则表达式搜索源文件中的图片格式,然后替换成base64的格式,base64编码在文件最后追加,并保存为新文件。

代码片段

引入依赖包

from PIL import Imageimport osimport base64import 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)

# 获取文件大小:KBdef 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文件,将图像转成rgbim.save(outfile_path, quality=quality) # 保存压缩后的图像print("图片已被压缩!")return infile_path# 如果当前图片大小大于压缩目标大小while o_size > aim_size:im = Image.open(infile_path)im = im.convert('RGB') # 为了存成jpg文件,将图像转成rgbim.save(outfile_path, quality=quality) # 保存压缩后的图像if quality - step < 0:breakquality -= stepo_size = get_size(outfile_path)print("图片已被压缩!")return outfile_path

具体的实现流程可以下次再说,代码已开源,欢迎访问并star我的gitee项目markdown image to base64.

三、效果展示及使用说明

文件目录如下:

我们现在对【test.md】进行格式转化。pic文件夹中有图片如下,且已经被【test.md】引用:

执行【img_to_base64.py】!!!,需要输入原始markdown路径,及希望压缩图片到多大。运行及打印结果如下:

(base) PS E:\mydoc\done\\summer\md_img2base64_project\tests> python .\img_to_base64.py******************************请输入目标markdown文件地址:"E:\mydoc\done\\summer\md_img2base64_project\tests\test.md"************************************************************请输入压缩图片允许最大体积(单位:KB): 100************************************************************图片:【pic/image-0422132634431.png】被读取!原始图像base64文本长度为:28816图片已被压缩!压缩图像base64文本长度为:28816************************************************************图片:【pic/image-0422132812199.png】被读取!原始图像base64文本长度为:233024图片已被压缩!压缩图像base64文本长度为:21488************************************************************文件图片转换成功!******************************请按任意键继续. . .

之后文件目录编程这样:

【对比两个markdown文本】:

原文件:

![image-0422132634431](pic/image-0422132634431.png)阿斯顿发撒打发### 方法士大夫/撒大大$\sigma$![image-0422132812199](pic/image-0422132812199.png)

转换后文件:

![image-0422132634431][Fig1]阿斯顿发撒打发### 方法士大夫/撒大大$\sigma$![image-0422132812199][Fig2]************************************************************************************************************************************************************************************************************************************************************************************************************[Fig1]:data:image/png;base64,iVBORw0KGgoAAAANSUhE...(省略)[Fig2]:data:image/png;base64,iVBORw0KGgoAAAANSUhE...(省略)

完美解决,从此告别图床服务器!

我还将该程序打包为可执行的exe文件,只要将文件放到markdown文件所在目录即可。

欢迎访问并star我的gitee项目markdown image to base64.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。