1。长期以来,世界一直在遭受苦难。像我这种经常需要写文章的技术自媒体,经常早上在公众号上发原创文章,中午有人同步我去知乎、今日头条等外部平台,拿到了第一在这些平台上发布本文。该平台的首次启动非常重要。以微信的公众号平台为例,一篇文章在公众号上是否可以原创,就是看是否是在公众号平台上首发。如果在公众号的文章库中没有搜索到与你的文章相似度较高的文章,那么你可以将其标记为原创。为了解决第一次发布的问题,我付费使用了OpenWrite平台。每月20元,一键分发到各大平台。很省心~第一次发布很重要,但有时候也不是那么重要。因为有专门的培训机构(我这里就不点名了,以免给他们反向营销),用你的文章给自己的账号堆干货来吸引眼球,他们不管原创与否,只要文章能发表。这种人在知乎这个没有原创检测机制的平台上可以过得很好。之前,某无良培训机构在知乎上开出10多个账号,分批转发我和一些朋友的原创文章。那时候,我每天可以汇报很多。渐渐地,我累了,一个人写了几百篇。如果一个个都查,基本一天都干不了,维权成本太高了。考虑到我的文章里有很多图片,为了让这些人无偿卖淫我的文章,也可以给我带来一些收入(当然,他们不可能出钱,但至少可以给我公众号广告也很好看)。于是我就想,有没有可能自己写一个工具,给自己的每一张图片加上自己的水印,看看他们还偷不偷。.2、目前的图床管理工具在开始讲如何使用Python实现我的需求之前,需要先介绍一下我的图床管理工具。我在写文章的时候,主要用到三个工具:Typora:Markdown文案编辑器Snipaste:非常好用的截图工具PicGo:非常人性化的图床管理工具其中,今天要参加的主角是PicGo,它有影响很大,对目前主流的所有图床平台都提供了很好的支持。当我用Snipaste截屏,然后按住快捷键(??P),就可以立刻上传你的图床到指定图床,上传的链接会在markdown图片中复制到剪贴板格式,直接粘贴即可。三、方案的构思整个工具我用了三年了,各种操作都非常熟悉,对它们产生了极度的依赖,所以现在想实现自动加水印的功能是在这套工具的基础。Snipaste和PicGo本身都不支持自定义水印,也不提供第三方插件的开发入口。Snipaste和PicGo之所以能够协同工作,是因为有了剪贴板这个桥梁,所以想要实现自己的需求,就只能从剪贴板中寻找突破口了。多余的废话不多说,直接说我的方案:Snipaste将图片放入剪贴板后,我输入自定义热键触发Python脚本从剪贴板读取图片,然后使用PIL给图片加水印,放回剪贴板,然后用Python脚本自动触发PicGo的快捷键。激活PicGo后,可以将带水印的图片上传至图床。为了让大家理解这个方案,有个直观的认识,我特地画了一个流程图,图中虚线部分就是我要自己实现的功能。4.完整代码分析4.1定义热键和监控键盘Python中有一个pynput库,可以用来监控系统的键盘。在其官方文档中,我很快找到了自定义热键组合的解决方案。frompynputimportkeyboarddefon_activate():print('全局热键激活!')deffor_canonical(f):returnlambdak:f(l.canonical(k))hotkey=keyboard.HotKey(keyboard.HotKey.parse('++h'),on_activate)withkeyboard.Listener(on_press=for_canonical(hotkey.press),on_release=for_canonical(hotkey.release))asl:l.join()但不幸的是,目前,这个函数有一个BUG。我在Mac上测试了它,但没有用。在github的issue中,2020年8月也有人回复了这个问题,没想到到现在才解决,虽然它本身提供了组合键监控模式不能用,但是普通的监控模式还是可以用的.只要有这个作为基础,我自己造轮子实现组合热键功能,对我来说就不难了。第1步:首先定义您的热键:???Pupload_pic_set={keyboard.Key.ctrl.value.vk,keyboard.Key.cmd.value.vk,keyboard.Key.alt.value.vk,keyboard.KeyCode(35).vk}第二步:以keyboard.Listener(on_press=on_press,on_release=on_release)为监听器监听所有键盘动作:listener.join()只要有按键处于按下状态,就将被添加到列表存储这个键(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.2ReadimagesfrommemoryPIL有一个ImageGrab模块,在这个模块中有一个grabclipboard函数,实现了从剪贴板读取图片的功能,但是读取的是rgb格式,因为我们后面加水印的时候一定要用rgba格式,所以又要用convert。fromPILimportImageGrabimg_rgb=ImageGrab.grabclipboard()image=img_rgb.convert("RGBA")4.3添加水印生成新图片下面是添加水印的代码。其实有一点你可能需要注意的是,如果你的文字中包含中文,那么在选择字体的时候,一定要是中文字体,否则会出现方块字defmake_watermark(image):txt=Image.new('RGBA',image.size,(0,0,0,0))fnt=ImageFont.truetype("/System/Library/Fonts/STHeitiMedium.ttc",20)draw=ImageDraw.Draw(txt)绘制。text(((txt.size[0]-300)//2,txt.size[1]-40),"微信公众号:Python编程时间",font=fnt,fill=(240,49,48,255))draw.text(((txt.size[0]-300)//2,txt.size[1]-70),"未经授权请勿转载",font=fnt,fill=(240,49,48,255))out=Image.alpha_composite(image,txt)returnout4.4重新创建新图像剪贴板中内置的io模块支持读写内存中的字节。只要在save时将PIL的图像对象保存在BytesIO对象中,然后通过pasteboard模块从BytesIO对象中加载数据,即可实现剪贴??板。将图像放入剪切板的功能。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)粘贴板加载的图片只支持PNG格式,所以保存的时候一定要指定PNG。另外,pasteboard还支持更多格式的数据,如PDF、音频数据、HTML、颜色数据等,更多格式可以查看:https://developer.apple.com/d...4.5下模拟触发PicGo一般情况下,我们使用快捷键触发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在上传图片后会通知自己,所以这个通知确实不是没有必要,看个人需要~5.其他设置工作5.1设置程序权限如果你在使用上面的脚本的时候发现有些按键无法捕获,那肯定是系统没有给权限,需要手动打开它。5.2设置开机自动启动这里添加一个启动项,这个init.sh是一个shell脚本。这个脚本的内容如下,注意最后的&一定不能省略。六、运行效果分析完所有的代码,你是不是很想看看这个程序运行后能达到什么样的效果?我录了一个GIF动图,你可以看看,真的很方便。7.写在最后对于和我有相同博客习惯的朋友,相信本文的思路会有所帮助。脚本我已经上传了(链接:https://wws.lanzous.com/iIDt1...,大家可以直接下载。另外,即使不需要反处理,代码的实现依然是值得学习的,比如如何监听键盘和定义程序的热键?如何从剪贴板中读取图像?如何给图像添加水印?如何将图像放入剪贴板?如何模拟键盘激活程序?编码的时候我也遇到了很多坑如何使用,经过多轮调试和查找,脚本终于完成了,文末介绍三个自己写的在线文档:第一个文档:PyCharm中文指南1.0文档用了两个多月整理100个PyCharm使用技巧。为了让新手上手ed,我花了很多时间录制了数百个GIF动画。感兴趣的可以去网上文档阅读。第二篇文档:PyCharmBlackMagicGuide1.0文档系统包含了各种Python冷门知识,各种PythonShell的玩法,疯狂的Python技巧,超详细的Python进阶知识解读,非常实用的Python开发技巧等。第三篇文档:Python中文指南1.0文档耗时三个月,编写了适合Python零基础初学者的完整中文教程。直观上,本教程既有深度又有广度。每篇文章都会标注内容的难易程度,是基础还是进阶,供读者选择。是不可多得的Python中文电子教程。