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. 一个开源轻量级的C#代码格式化工具(支持VS和VS Code)

    前言 C#代码格式化工具除了ReSharper和CodeMaid,还有一款由.NET开源.免费(MIT License).轻量级的C#语言代码格式化工具:CSharpier. 工具介绍 CSharpi ...

  2. Swift File Manager 三种文件路径查找方法对比

    目录 1. 引言 2. 三种文件路径查找方法 2. 1 NSSearchPathForDirectoriesInDomains(_:_:_:) 2.2 urls(for:in:) 2.3 url(fo ...

  3. windows版 navicat_15.0.18 安装

    视频安装地址: https://www.ghpym.com/ghvideo07.html 一.下载安装包 下载地址(百度网盘): 链接:https://pan.baidu.com/s/1MIZfmS5 ...

  4. Critical Expression

    什么是Critical Expression 所谓Critical Expression就是一个表达式依赖的值,必须出现在这个表达式前面.比如: times (label-$) db 0 ;times ...

  5. WEB服务与NGINX(26)- 实现Nginx高并发系统内核参数优化

    1. 实现Nginx高并发系统内核参数优化 由于默认的Linux内核参数考虑的是最通用场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数,使得Nginx可以拥有更 ...

  6. CSS自适应网页(CSS第一篇)

    ​CSS的属性: 用浏览器自带的审查元素对一些页面进行调整,快捷键是F12. 网页允许宽度自适应: 在代码的头部加入一行viewport元标签. <meta name="viewpor ...

  7. ctf_web

    ctfshow web13 访问题目链接 一看是一道文件上传题,上传文件进行测试 上传php会显示 error suffix 因此推测会检测格式 当文件字数超出一定字数时,显示 error file ...

  8. VSCode配置JetBrains Mono字体

    1. 下载JetBrains Mono字体 官网下载地址:https://www.jetbrains.com/lp/mono/ 2. 在VSCode配置字体 { "editor.fontFa ...

  9. Android 12(S) MultiMedia Learning(三)MediaPlayer Native

    上一篇MediaPlayer中看到实现一个最简单的播放器只需要5个接口,接下来会看看这些接口实现内容 /************************************************ ...

  10. .net core 关于对swagger的UI(Index.html)或接口的权限验证;

    背景: 如何在ASP.Net Core的生产环境中保护swagger ui,也就是index.html页面.其实swagger是自带禁用的功能的,只需要设置开关即可.但是有一些场景,是需要把这些接口进 ...