为了解决了首发的问题,我付费使用了OpenWrite这个平台,每个月20块钱的费用,一键就可以分发各大平台,非常的省心~
首发固然重要,但有时候也没那么重要。
这种人在知乎这种没有原创检测机制的平台,可以活得很好。
于是我就想啊,是不是可以自己写个工具,给自己的每张配图上都加上自己的水印,看他们还盗不盗。。
在开始讲如何利用Python来实现我的需求之前,我有必要介绍下我的图床管理工具。
其中今天的要参与的主角是PicGo
它对当下主流的图床平台都提供了很好的支持
当我使用了Snipaste截图后,再按住快捷键(P),就可以立即将你的图床上传至指定图床,并且将上传后的链接以markdown的图片格式复制到剪切板中,你可以直接粘贴使用。
由于这一整工具,我已经使用了三年,各种操作都非常的熟悉,对他们我已经产生了极度的依赖,因此现在我想要实现自动加水印的功能,也一定是建立在这套工具的基础上完成的。
Snipaste和PicGo本身都不支持自定义水印,也不提供第三方插件的开发入口。
Snipaste和PicGo之所以能够在一起工作,是因为有了剪切板这个桥梁,因此想要实现自己的需求,只能从剪切板上寻找突破口。
多余的废话就不多说了,我直接说下我的方案:
为了让你对这个方案,有一个直观的理解,我特地画了一张流程图,其中虚线就是我得自己实现的功能。
在Python中有一个pynput库,利用它可以来监听系统的键盘。
在它的官方文档中,很快找到了一个可以自定义热键组合的方案。
虽然它本身提供的组合键监听模式无法使用,但普通的监听模式还是可以使用的,只要有这个做为基础,那我自己造轮子也不难实现组合热键的功能。
第一步:先定义好你的热键:P
upload_pic_set={keyboard.Key.ctrl.value.vk,keyboard.Key.cmd.value.vk,keyboard.Key.alt.value.vk,keyboard.KeyCode(35).vk}第二步:监听所有的键盘动作
withkeyboard.Listener(on_press=on_press,on_release=on_release)aslistener:listener.join()只要有一个键处于press的状态,就往列表中存放这个键
key_list=[]defon_press(key):ifisinstance(key,keyboard.KeyCode):key_list.append(key.vk)elifisinstance(key,keyboard.Key):key_list.append(key.value.vk)ifset(key_list)==upload_pic_set:image=get_image_from_clipboard()new_image=make_watermark(image)put_image_to_clip(new_image)upload_image_via_picgo()notify_to_mac("成功添加水印并上传到图床")但是一旦有键释放了,就要清空这个列表
defon_release(key):key_list.clear()每一次按下键都会检查,key_list是否等于定义好的快捷键,如果刚好是相等,就可以开始图片的处理逻辑了。
ifset(key_list)==upload_pic_set:pass4.2从内存中读取图像PIL有一个ImageGrab模块,在这个模块中有一个grabclipboard函数,它实现了从剪切板中读取图像的功能,不过读取的rgb格式,由于我们后面加水印时,必须使用rgba格式才可以,因此再用convert转一下。
fromPILimportImageGrabimg_rgb=ImageGrab.grabclipboard()image=img_rgb.convert("RGBA")###4.3添加水印生成新图像
以下是添加水印的代码,其实可能要注意的一点就是如果你的文字里包含中文,那么选择字体时一定要是中文字体,否则会出现方块字
defput_image_to_clip(image):img_byte_arr=io.BytesIO()pb=pasteboard.Pasteboard()image.save(img_byte_arr,format='PNG')img_byte_arr=img_byte_arr.getvalue()pb.set_contents(img_byte_arr,pasteboard.PNG)pasteboard载入的图像只支持PNG格式,因此在保存时,一定要指定PNG。
此外pasteboard还支持更多格式的数据,比如PDF,音频数据,HTML、颜色数据等等
正常情况下,我们是通过快捷键来触发PicGo去从剪切板中上传图像的,因此想要在程序中激活PicGo,也只需要在Python脚本中模拟键盘动作即可。
具体的代码如下:
frompykeyboardimportPyKeyboarddefupload_image_via_picgo():k=PyKeyboard()k.press_keys(['Command','shift','p'])4.6通知Mac通知台上面整个过程都是脚本在后台默默运行的,如果没有任何通知,作为用户,很难知道我们的图片是否处理好,是否上传成功,因此建议加一个通知的函数。
importosdefnotify_to_mac(message):os.system("osascript-e'displaynotification\"{}\"\'".format(message))不过其实PicGo上传完图片后,本身就会通知,所以这个通知并不是必要的,看个人需求啦~
如果你在使用如上脚本时,发现有的键无法捕捉,那一定是系统没有给予权限,需要你手动开启。
在这里添加一个开机启动项,而这个init.sh是一个Shell脚本。
代码全部解析完了,是不是很想看这个程序运行后,可以实现怎样的效果呢?
我录制了个GIF动态图,你可以瞧一瞧,真的太方便了。
另外,即使你没有防搬运的需求,代码的实现依然值得学习,比如
在编码的时候,也遇到了不少的坑,有的第三方库并不适用于Mac,有的有BUG至今也还没修复,有的甚至要阅读源码才能知道如何使用,经过多轮的调试和搜索,最终才完成这个脚本。
系统收录各种Python冷门知识,PythonShell的多样玩法,令人疯狂的Python炫技操作,Python的超详细进阶知识解读,非常实用的Python开发技巧等。