项目介绍
MarkdownPicPicker 是一个Markdown写作辅助工具。它能将剪贴板中的图片上传到网络图床中,并将markdown格式的图片链接(![](<图片地址>))复制到剪贴板中。
功能介绍
第1.1.0版有以下功能:
图床支持七牛云与SM.MS, 默认使用SM.MS
开箱即用,不需要配置
通过配置实现自定义图床
支持Mac OS
将图片保存在本地
图片上传成功后将Markdown格式的图片地址保存到剪贴板中
Uploader扩展性
使用方法
Windows
下载最新版程序:https://github.com/kingname/MarkdownPicPicker/releases/download/v1.0.0/MarkdownPicPicker_v1.0.0.zip
复制图片到剪贴板
双击运行markdownpicpicker.exe
Mac OS
安装pngpaste: brew install pngpaste
Clone 源代码
复制图片到剪贴板
python MarkdownPicPicker.py
配置
使用七牛云
在没有配置文件的情况下,MarkdownPicPicker默认使用的图床为SM.MS, 但是这个图床仅仅作为临时使用,可能会被墙,也不保证数据安全。如果你需要使用七牛云,请创建config文件夹,并将config.ini配置好再放进去。
配置
配置文件保存在config/config.ini文件中,其意义分别如下:
[basic] picture_folder = pic #图片本地保存文件夹 picture_suffix = png #图片后缀名 # 图片上传插件的文件名,不带".py" picture_host = QiniuUploader [QiniuUploader] access_key = Q6sS422O0fasfsadasdfahqasdftqvyQasdf5Zvzw secret_key = 6QtAqqTxoSxZadffsdfasdfaaffasCmoOaB2aLObM container_name = picturebed url = http://7sbpmp.com1.z0.glb.clouddn.com/{}
其中access_key 和 secret_key 可以在七牛云的控制面板中看到,如图:
只复制图片链接
如果你希望只将图片的url复制到剪贴板中,而不是复制![](图片url), 你可以为markdownpicpicker.exe添加上 -linkonly 参数。在markdownpicpicker.exe所在目录打开cmd, 输入:
markdownpicpicker.exe -linkonly
建议大家使用AutoHotKey来启动程序。这样可以把整个流程缩短到2秒钟。AutoHotKey的配置示例如下图所示:
需要首先使用QQ截图或者其他截图工具将图片保存到剪贴板中,然后按下设定好的快捷键即可。Markdown格式的图片链接就已经保存到剪贴板中了。在需要使用的地方直接粘贴。
开发
目前MarkdownPicPicker支持七牛云和SM.MS两个图床,但是你可以非常方便的将自己的图床集成到MarkdownPicPicker。希望你能在集成了自己常用的图床以后,给我发一个PR,从而造福大家。
规则说明:
请将你的图床上传程序放在uploader文件夹下,文件名任意,例如ExampleUploader.py
程序的类名必需为Uploader
如果你的图床需要token等等一系列参数,请在init中设置config_info参数,你写在配置文件中的所有参数都将会通过config_info以字典的形式传进来。
def __init__(self, config_info=None): self.token = config_info['token'] self.username = config_info['username'] self.password = config_info['password'] self.url = config_info['url']
程序必须有一个upload方法:
def upload(self, picture_path, link_only=False)
打开config/config.ini, 添加你的上传程序的相关信息,Section为你的上传程序的名字(不含.py)并设定[basic]下的picture_host为此Section例如:
[basic] picture_folder = pic picture_suffix = png picture_host = ExampleUploader [ExampleUploader] token = 123456 username = xxx password = yyy url = http://xxx.xxx/upload
说明
如果你希望自己从源代码编译程序,请注意以下问题:
Pillow bug修正
本程序Windows端使用了Pillow库中的 ImageGrab.grabclipboard() 方法来获取剪贴板中的数据,但是由于这个方法有一个bug, 导致可能会发生以下错误:
Unsupported BMP bitfields layout
这个问题从Pillow 2.8.0开始,一直到3.2.0都没有被官方解决。目前有一个间接的解决办法。 请打开Python安装目录下的\Lib\site-packages\PIL\BmpImagePlugin.py文件,将以下代码:
if file_info['bits'] in SUPPORTED: if file_info['bits'] == 32 and file_info['rgba_mask'] in SUPPORTED[file_info['bits']]: raw_mode = MASK_MODES[(file_info['bits'], file_info['rgba_mask'])] self.mode = "RGBA" if raw_mode in ("BGRA",) else self.mode elif file_info['bits'] in (24, 16) and file_info['rgb_mask'] in SUPPORTED[file_info['bits']]: raw_mode = MASK_MODES[(file_info['bits'], file_info['rgb_mask'])] else: raise IOError("Unsupported BMP bitfields layout") else: raise IOError("Unsupported BMP bitfields layout")
修改为:
if file_info['bits'] in SUPPORTED: if file_info['bits'] == 32 and file_info['rgba_mask'] in SUPPORTED[file_info['bits']]: raw_mode = MASK_MODES[(file_info['bits'], file_info['rgba_mask'])] self.mode = "RGBA" if raw_mode in ("BGRA",) else self.mode elif file_info['bits'] in (24, 16) and file_info['rgb_mask'] in SUPPORTED[file_info['bits']]: raw_mode = MASK_MODES[(file_info['bits'], file_info['rgb_mask'])] '''新增内容开始''' elif file_info['bits'] == 32 and file_info['rgb_mask'] == (0xff0000, 0xff00, 0xff): pass '''新增内容结束''' else: raise IOError("Unsupported BMP bitfields layout") else: raise IOError("Unsupported BMP bitfields layout")
就能解决本问题。
1: ASR语言模型在线训练工具 2: TTS在线语音合成工具
本文向大家介绍python人民币小写转大写辅助工具,包括了python人民币小写转大写辅助工具的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python人民币大小写转换的具体代码,供大家参考,具体内容如下 大家应该都知道,银行打印账单有时候会跟上人民币的阿拉伯数字以及人民币汉字大写写法,转换的过程中有一定的逻辑难度,较为麻烦,所以笔者心血来潮,花了点时间简单实现了一下这一转换过程,
Using 创建一个只在Observable生命周期内存在的一次性资源 Using操作符让你可以指示Observable创建一个只在它的生命周期内存在的资源,当Observable终止时这个资源会被自动释放。 using操作符接受三个参数: 一个用户创建一次性资源的工厂函数 一个用于创建Observable的工厂函数 一个用于释放资源的函数 当一个观察者订阅using返回的Observable时,
Timestamp 给Observable发射的数据项附加一个时间戳 RxJava中的实现为timestamp,它将一个发射T类型数据的Observable转换为一个发射类型为Timestamped<T>的数据的Observable,每一项都包含数据的原始发射时间。 timestamp默认在immediate调度器上执行,但是可以通过参数指定其它的调度器。 Javadoc: timestamp()
Timeout 对原始Observable的一个镜像,如果过了一个指定的时长仍没有发射数据,它会发一个错误通知 如果原始Observable过了指定的一段时长没有发射任何数据,Timeout操作符会以一个onError通知终止这个Observable。 RxJava中的实现为timeout,但是有好几个变体。 第一个变体接受一个时长参数,每当原始Observable发射了一项数据,timeout就
TimeInterval 将一个发射数据的Observable转换为发射那些数据发射时间间隔的Observable TimeInterval操作符拦截原始Observable发射的数据项,替换为发射表示相邻发射物时间间隔的对象。 RxJava中的实现为timeInterval,这个操作符将原始Observable转换为另一个Observable,后者发射一个标志替换前者的数据项,这个标志表示前者的
SubscribeOn 指定Observable自身在哪个调度器上执行 很多ReactiveX实现都使用调度器 “Scheduler“来管理多线程环境中Observable的转场。你可以使用SubscribeOn操作符指定Observable在一个特定的调度器上运转。 ObserveOn操作符的作用类似,但是功能很有限,它指示Observable在一个指定的调度器上给观察者发通知。 在某些实现中还
Subscribe 操作来自Observable的发射物和通知 Subscribe操作符是连接观察者和Observable的胶水。一个观察者要想看到Observable发射的数据项,或者想要从Observable获取错误和完成通知,它首先必须使用这个操作符订阅那个Observable。 Subscribe操作符的一般实现可能会接受一到三个方法(然后由观察者组合它们),或者接受一个实现了包含这三个方