"markdown一时爽, 分享火葬场", markdown的简便性和美观性一直受到诸多码农偏爱. 但是markdown文件不支持内嵌图片, 所有的图片都以外部链接的方式插入. 所以分享Markdown文件的时候就不得不和图片一起发送, 同时还得注意设置图片路径, 让强迫症患者难以接受.

结合base64编码方式, 我找到了一种极为方便的在markdown文件中插入图片的方法:

示例图一: 在截屏快捷键截屏后直接复制base64编码到Markdown编辑器

【Markdown】Markdown插入图片的完美解决方法_文件对话框

1.gif

示例图二: 在Markdown编辑器打开文件选择框, 选择图片并粘贴base64编码文件至Markdown编辑器.

【Markdown】Markdown插入图片的完美解决方法_python_02

2.gif

要实现以上两种功能需要完成以下几个步骤:


  • 1.利用文件选择框选择文件或者从剪贴板读取图像
  • 2.将图片转为Base64编码
  • 3.将转换结束的Base64编码传递至剪贴板
  • 4.将以上脚本绑定至Windows全局快捷键

首先, 我们考虑实现第一个功能: 从文件选择框选择文件或获取剪贴板图像

从文件选择框选择文件非常简单, 可以用如下Python代码实现:


import win32ui  dlg = win32ui.CreateFileDialog(1)  # 1表示打开文件对话框  dlg.SetOFNInitialDir('C:\\Users\\Desktop')  # 设置打开文件对话框中的初始显示目录  dlg.DoModal()  filename = dlg.GetPathName()  # 获取选择的文件路径和名称</pre> 

第二个功能是获取剪贴板的图像文件, 同样用如下代码实现:


from PIL import ImageGrab im = ImageGrab.grabclipboard()#获取剪贴板文件 if isinstance(im, Image.Image):  img = im else:  pass 

其实是实现图片转Base64编码文本, 这一步非常简单, python代码如下:


with open("D:\\PythonCode\\base64pic\\1.jpg", 'rb') as f:  base64_data = base64.b64encode(f.read())  s = base64_data.decode()  print('(data:image/jpeg;base64,%s) \n'%s)</pre> 

再次, 将Base64编码传递至剪贴板. 这一步需要用CMD命令实现, 使用CMD的 ​​clip​​ 命令即可, 代码如下:


@echo off python D:\\123.py | clip 

以上代码即可实现运行python脚本, 同时将python脚本的输出传递至剪贴板. 但是使用以上代码, 就是我们使用了​​@echo off​​ 关闭了命令行的代码输出, 使用命令的时候依旧会弹出难看的CMD命令框, 着实不够优雅.

还好, 我们永远有 Plan B. 我们还可以使用VBscript运行脚本, 同时隐藏难看的CMD命令框, 代码如下:


>Set ws = createObject("WScript.shell")  ws.run "cmd /c python D:\\PythonCode\\base64pic.py | clip",vbhide 

最后, 我们考虑最后一个功能的实现, 绑定以上脚本至Windows全局快捷键.

实现这一功能有两种方式:

方法一是用Windows快捷方式自带的实现, 示意图如下:

【Markdown】Markdown插入图片的完美解决方法_markdown编辑_03

image.jpeg

但是缺点在于反应十分慢, 慢到难以接受.

第二种方法则是将脚本的快捷方式放在任务栏, 使用 ​​Windows + 数字​​ 的方式快捷调用, 示意图如下:

【Markdown】Markdown插入图片的完美解决方法_python_04

image.jpeg

一个小tips是, 可以用"更换图标" 的功能给快捷方式换一个好看的图标, 示意图如下:

【Markdown】Markdown插入图片的完美解决方法_文件对话框_05

image.jpeg

结果就是这样的:

【Markdown】Markdown插入图片的完美解决方法_文件对话框_06

image.jpeg

附:

1.Python完整代码


import win32ui,os,base64 from PIL import Image,ImageGrab  im = ImageGrab.grabclipboard() if isinstance(im, Image.Image):  img = im else:  dlg = win32ui.CreateFileDialog(1)  # 1表示打开文件对话框  dlg.SetOFNInitialDir('C:\\Pictures')  # 设置打开文件对话框中的初始显示目录  dlg.DoModal()  filename = dlg.GetPathName()  # 获取选择的文件名称  img = Image.open(filename)  img.thumbnail((778,439),Image.ANTIALIAS) img=img.convert('RGB') img.save("D:\\PythonCode\\base64pic\\1.jpg", quality=70)  with open("D:\\PythonCode\\base64pic\\1.jpg", 'rb') as f:  base64_data = base64.b64encode(f.read())  s = base64_data.decode()  print('![](data:image/jpeg;base64,%s)'%s)  os.remove("D:\\PythonCode\\base64pic\\1.jpg") 

2.VBS脚本完整代码


Set ws = createObject("WScript.shell")  ws.run "cmd /c python D:\\PythonCode\\base64pic\\base64pic.py | clip",vbhide


作者:地平线上的背影