当前位置: 首页 > news >正文

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

原文:https://www.jianshu.com/p/8c0d00fca9b3

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

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

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

1.gif

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

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快捷方式自带的实现, 示意图如下:

image.jpeg

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

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

image.jpeg

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

image.jpeg

结果就是这样的:

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


作者:地平线上的背影
链接:https://www.jianshu.com/p/8c0d00fca9b3
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【springBoot】springBoot 学习笔记
  • 【spring】PO,VO,DAO,BO,POJO,Bean之间的区别与解释
  • 【java】堆栈、堆、方法区介绍
  • 【java】反射机制
  • 【微服务】什么是微服务?微服务与分布式的区别?微服务怎么具体实践微服务?服务端发现和客户端发现...
  • 【Spring boot】Spring boot之@Value注解的使用总结---研读
  • 【mysql】MySQL 面试,必须掌握的 8 个知识点
  • 【大厂面试】面试官看了赞不绝口的Redis笔记
  • 【C/C++】理解C和C++中的左值和右值
  • 【MQTT】MQTT C语言客户端实现/ MQTT嵌入式客户端
  • 【VS】VS工程设置(包含目录、库目录、附加包含目录、附加库目录、附加依赖项)等...
  • 【linux】最小测试工程miniTest
  • 【VS】判断dll/lib是32/64位|查看lib是导入库/静态库的方法
  • 【C++】C++写后端程序
  • 【C++】C++ 知识点100题
  • 深入了解以太坊
  • [译]Python中的类属性与实例属性的区别
  • 230. Kth Smallest Element in a BST
  • HTML-表单
  • JavaScript创建对象的四种方式
  • Javascript基础之Array数组API
  • JavaScript中的对象个人分享
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Python3爬取英雄联盟英雄皮肤大图
  • spring security oauth2 password授权模式
  • Spring框架之我见(三)——IOC、AOP
  • Web设计流程优化:网页效果图设计新思路
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 工作手记之html2canvas使用概述
  • 警报:线上事故之CountDownLatch的威力
  • 漂亮刷新控件-iOS
  • 巧用 TypeScript (一)
  • 听说你叫Java(二)–Servlet请求
  • 阿里云重庆大学大数据训练营落地分享
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #pragam once 和 #ifndef 预编译头
  • ${factoryList }后面有空格不影响
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (八十八)VFL语言初步 - 实现布局
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (简单) HDU 2612 Find a way,BFS。
  • (六)c52学习之旅-独立按键
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)Sublime Text3配置Lua运行环境
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)