author="CKboss"

date="2022-4-19"

title="在Markdown中使用base64存图片"

+++

在Markdown中使用base64存图片

使用markdown最大的痛点之一就是上传图片时需要额外的图床, 而图床又很容意出问题导致图片丢失.

如果可以把图片以base64的方式存在markdown文件中, 就可以省去寻找可靠图床的麻烦.

本文会介绍一个可行的在markdown中使用base64存储图片的方案

什么是Data URL

简单来说, 就是先把图片或附件转成base64, 再利用类似 data:[<mediatype>][;base64],<datat> 的形式在html中展示.

DataURL可以方便的将附件以纯文本的形式在网页上保存, 这正是我们想要的.

但需注意, DataURL的缺点也很明显, base64编码后文件体积会大上30%, base64格式的图片在浏览器上加载缓慢, base64过长的编码会让html文件难以编辑等.

图片转base64

有很多在线的工具都可以进行图片到base64的转换.

为了离线方便, 还可以使用如下的python代码将图片转成data_url的形式:

import tkinter as tk
from tkinter import filedialog, messagebox
import pyperclip import cv2
import os
import base64
import tempfile
from pathlib2 import Path class ImageBase64Optim: # base64 前缀
@classmethod
def get_img_base64_prefix(cls, img_type):
img_type_map = {
'jpg': 'data:image/jpeg;base64,',
'jpeg': 'data:image/jpeg;base64,',
'png': 'data:image/png;base64,',
}
return img_type_map[img_type.lower()] # 短边1080
@classmethod
def shot_edge_resize(cls, img, short_edge=720):
h,w,_ = img.shape
if max(h,w) < short_edge:
return img
if w <= h :
w2 = short_edge
h2 = int( short_edge * h / w + 0.5)
else:
w2 = int( short_edge * w / h + 0.5 )
h2 = short_edge
img = cv2.resize(img,(w2,h2))
return img # 低质量的jpg
@classmethod
def trans_to_low_quality_img(cls, img_path, tmpimg):
img = cv2.imread(img_path)
img = ImageBase64Optim.shot_edge_resize(img)
cv2.imwrite(tmpimg,img,[cv2.IMWRITE_JPEG_QUALITY, 55]) @classmethod
def base64_img(cls, img_path):
"""
拿到图片的base64编码结果
:param img_path 图片路径
:rtype: str
"""
with tempfile.NamedTemporaryFile(mode='a+',suffix='.jpg',delete=False) as tmpimg:
tname = tmpimg.name
ImageBase64Optim.trans_to_low_quality_img(img_path,tname)
with open(tname, 'rb') as f:
compress_img_content = f.read()
# 对图片内容编码
ret_str = cls.get_img_base64_prefix(os.path.splitext(tname)[1][1:]) + str(base64.b64encode(compress_img_content), 'utf-8')
os.remove(tmpimg.name)
return ret_str def process(img_path: str):
# img_path = Path('./Microsoft_Nostalgic_Windows_Wallpaper_4k.jpg')
img_path = Path(img_path)
ret = ImageBase64Optim.base64_img(img_path.as_posix())
return ret def run_gui():
window = tk.Tk()
window.withdraw()
img_file_path = filedialog.askopenfilename()
ret = process(img_file_path)
pyperclip.copy(ret)
messagebox.showinfo(message="base64 already copy.") def run_cli():
img_file_path = filedialog.askopenfilename()
ret = process(img_file_path)
print(ret) if __name__=='__main__':
run_gui()

为了让base64编码后的图片体积不过于庞大.

在此代码中, 对于过大的输入图片会将其缩放到短边1080像素, 同时还在进行jpeg编码的过程中降低了原有图像质量.

具体来说, 对于输入的4k大小的图片编码后的base64大小可以控制在300k左右, 图像质量会有些许损失, 不过对于个人blog来说, 还是足够使用的.

在Markdown中使用

可以在markdown文件的最后一部分, 以 [p1]: data ...... 的形式贴上转码后的图片base64

在markdown文件的正文中, 以 ![][p1] 的形式使用图片.

很多静态网站的主题, 是可以自动忽略掉data内容的, 所以不用担心文章最后有大量的base64编码看起来像乱码.

一个使用base64展示图片的例子

可以打开源码以供参考


在Markdown中使用base64存图片的更多相关文章

  1. 工具分享:清理 Markdown 中没有引用的图片

    前言: 之前,我写笔记的工具一直都是 notion,而且没有写博客的习惯.但是一是由于 notion 的服务器在国外,有时候很不稳定:二是由于 notion 的分享很不方便,把笔记分享给别人点开链接之 ...

  2. 在HTML中显示base64 img 图片

    base64的图片可以直接显示在网页上面 <img src=“data:image/png;base64,******************************************** ...

  3. markdown中设置、调整图片尺寸

    使用百分比描述尺寸 <img src="https://img2018.cnblogs.com/blog/1122471/201902/1122471-2019022218575673 ...

  4. 减少HTTP请求之将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片(大型网站优化技术)

    在网站开发过程中,对于页面的加载效率一般都想尽办法求快.那么,怎么让才能更快呢?减少页面请求 是一个优化页面加载速度很好的方法.上一篇博文我们讲解了 “利用将小图标合成一张背景图来减少HTTP请求”, ...

  5. 在markdown中插入github仓库中的图片

    右击github中的图片,获得链接: https://github.com/nxf75/ML_Library/blob/master/Hadoop/Haddop%E6%A1%86%E6%9E%B6.p ...

  6. 【干货】Markdown编辑博文,公式图片轻松搞定

    # Markdown 使用操作手册 作者:白宁超 Blog:伏草唯存 Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」 ...

  7. netty系列之:java中的base64编码器

    简介 什么是Base64编码呢?在回答这个问题之前,我们需要了解一下计算机中文件的分类,对于计算机来说文件可以分为两类,一类是文本文件,一类是二进制文件. 对于二进制文件来说,其内容是用二进制来表示的 ...

  8. Markdown中插入数学公式的方法

    Markdown中插入数学公式的方法 文章来源:http://blog.csdn.net/xiahouzuoxin/article/details/26478179 自从使用Markdown以来,就开 ...

  9. 通过data:image/png;base64把图片直接写在src里

    从网上下了个源文件查看时候发现了引用图片的地址不是在本地上的,而是后面跟了一大串字符data:image/png;base64...查了一下资料分析如下: 关于用base64存储图片 网页上有些图片的 ...

  10. Markdown中插入数学公式

    如果想复杂使用的话,百度Latex公式,找些看一下. 使用MathJax引擎 大家都看过Stackoverflow上的公式吧,漂亮,其生成的不是图片.这就要用到MathJax引擎,在Markdown中 ...

随机推荐

  1. 2018-2-13-win10-uwp-无法附加到CoreCLR

    title author date CreateTime categories win10 uwp 无法附加到CoreCLR lindexi 2018-2-13 17:23:3 +0800 2018- ...

  2. Istio微服务入门---通过istio部署微服务实现灰度发布(15)

    一.Istio简介 1.1 Istio介绍 官方文档:https://istio.io/docs/concepts/what-is-istio/ 中文官方文档:https://istio.io/zh/ ...

  3. java引入jep实现四则运算包含负数且规范两位小数

    1.在pom中引入依赖 <!--四则运算--> <dependency> <groupId>jep</groupId> <artifactId&g ...

  4. 【web安全】修改和配置tomcat版本信息

    场景 目前网络安全的越来越受重视,tomcat作为重要的web容器被广泛应用,如何隐藏信息保证.在开放网络世界中,不易被攻击. 操作思路 1.进入Tomcat文件中的lib文件夹,将catalina. ...

  5. tomcat(3)- tomcat部署zrlog

    目录 1. Tomcat单独部署 2. nginx+tomcat部署 1. Tomcat单独部署 部署场景为: 客户端:192.168.20.1 tomcat:主机名:tomcat01,地址:192. ...

  6. 1.简单的C语言程序

    简单的C语言程序 什么是计算机程序? 什么是计算机语言? 所谓程序,就是一组计算机能识别和执行的指令. 什么是计算机语言? 机器语言(0,1 '低级语言'),汇编语言(符号化 '低级语言'),高级语言 ...

  7. fastposter v2.9.2 最简海报生成器

    fastposter v2.9.2 程序员必备海报生成器 fastposter海报生成器是一款快速开发海报的工具.只需上传一张背景图,在对应的位置放上组件(文字.图片.二维.头像)即可生成海报. 点击 ...

  8. vue3创建工程

    创建 Vue3 项目的步骤如下: 安装 Node.js Vue3 需要依赖 Node.js 环境,因此需要先安装 Node.js.可以从官网下载 Node.js 的安装包并安装,也可以使用包管理器安装 ...

  9. Splashtop和 TiFlux 宣布建立合作伙伴关系

    2020年9月21日,远程访问解决方案的全球领导者 Splashtop Inc. 和面向 IT 服务提供商的 IT 解决方案公司 TiFlux 宣布建立合作伙伴关系,以整合 Splashtop 远程访 ...

  10. 原创->CommonsCollections1-DefaultMap链

    今天我打算整点儿不一样的内容,通过之前学习的TransformerMap和LazyMap链,想搞点不一样的,所以我关注了另外一条链DefaultedMap链,主要调用链为: 调用链详细描述: Obje ...