推荐一款好用的截图工具——ShareX

发布于 2020-12-17  545 次阅读


原文地址

近日在朋友的安利下,第一次使用了第三方的截图工具,经过了一番折腾后体验非常良好,因此安利 + 分享一下使用经验

从一个图床说起

在某论坛有一个很神奇的现象,很多人都喜欢购买大容量的 vps 来搭建自己的图床,而这些图床多使用着随处可见的图床程序,并且由于追求成本,这些图片文件多存储于本地的 HDD 上,虽然有 cf 的缓存不至于在高负载下 io 爆炸,然而这些单机的 Raid 总会让人对文件的安全性有所担忧;另外由于某些原因,cf 大陆直连在晚高峰时段速度十分感人,生动形象说明了如下的一个道理:

另外做的很大的路过图床经常莫名解析不出 ip、sm.ms 图床也推出了会员制并撤掉了免费用户的香港 cdn 节点,不得让人担心这些图床会不会突然有一天就跑路了;诚然,一个正常运营的图床需要付出大量的流量成本,并且体验越好,成本也越高,推出会员或者捐赠等变现渠道无可厚非,但这也引发了我们的思考——在有限的成本下,如何做出一个可靠性、速度有保障的图床程序;经过讨论,后者除了加钱并没有什么好办法 233,但是就可靠性来说,我们可以使用下很时髦的 Serverless 来达成,通过函数服务来实现图床程序,存储则使用高可用的网盘程序而不是传统的单机硬盘 / SSD 阵列,理论上可以获得非常高的可用性;因此,某位大佬就兴趣使然地造了这么一个轮子,也就是现在的流浪图床

流浪图床的特性,完全依托于函数服务,实现 Serverless 的服务,同时使用可靠的网盘加密存储,通过另外的服务器进行定时增量同步,保证存储的可靠;另外,虽然并不是什么革命性的功能,但是流浪图床少有地支持了 webp 格式的图像上传,webp 图像相比 jpeg、png 等格式在压缩率上具有一些优势,这对于晚高峰时间 cf 糟糕的连接速度来说,可以有效提升用户的使用体验,同时,非常重要的一点——webp 支持动画的编码,并且压缩率能够吃到 avc 格式的尾气,这意味着使用 webp 我们将可以摆脱体积又大还有瞎眼的 256 色 dithered gif 图像,同时几乎不需要对现有的网站做出什么大的功能改动,用户只需要升级到现代的浏览器即可无缝支持良好画质的 webp 动图。因此接下来,我们想通过调教 ShareX,让他能够与我们的流浪图床搭配,达到良好的截图、分享体验;

困难 & 目标

想要实现这个目标,还有一些小困难,首先 ShareX 并不原生支持 webp 格式,作者在多年前的 issue 里非常直白的说了自己不会加入 webp 的支持,也不会 merge 相关的 commit,如果想用,自己去整 action…… 那没有办法,只好自己动手丰衣足食了;

ShareX 可以设置截图完成后的动作,可以在截图完成后自动上传,也可以在截图上传完成后自动将链接复制到剪贴板;因此我们想实现如下的一个工作流程:

快捷键截图 -> 截图为png格式并复制到剪贴板、png转码为webp存储到硬盘
如果需要网络分享 -> 手动打开截图历史 -> 选中图片并上传 -> 上传完成后自动将链接复制到剪贴板

之所以将工作流程分为如此两步,主要是因为:

1、如果默认所有的截图都上传到图床,在剪贴板中只留下图片外链,可能会有个人隐私问题,因此上传与否需要用户手动决定;

2、由于 telegram 默认将小体积的 webp 图像当作 sticker 处理,无法放大,因此我们希望上传前留在剪贴板中的图像文件仍然是 png 格式

如果还想有什么更方便的功能的话,还可以加上这样一条:

监控某个文件夹,如果文件夹下有mp4格式文件,就将它转换成webp格式的动图,并上传到图床获取外链

加上这一条的话,如果看到了什么精彩的视频片段,便可以用 ffmpeg 直接将对应片段的视频流 copy 到监控文件夹内,稍等片刻,剪贴板上便会出现相比 gif 高质量的动图。

具体配置

流浪图床自定义上传

首先,ShareX 并没有集成流浪图床的上传,因此首先我们要将其添加到自定义上传当中,具体如下:

  • 首先在目的地 - Custom uploader settings 中新建一个自定义上传,名称可以随便取,需要编辑的内容如下:
上传目标类型:图像、文件
请求方法:POST
请求URL:https://p.sda1.dev/api/v1/upload_external_noform
URL参数:名称 filename;值 $filename$
请求体:  Binary
  • 切换请求页面到相应页面,填写如下两项:
URL:$json:data.url$
删除URL:$json:data.delete_url$
(只需要填写JSON部分)
  • 将左下角的图片和文本上载器都改成自定义的上载器(途中全整成 p.sda1.dev 了不要在意)

更改截图类型(可选)

因为对 jpg 格式有着某种傲慢的偏见,因此我把默认截图格式改成 png 了。

硬盘保存 webp 格式,根据需要上传

这里有三点要求,首先,默认截图的是 png 格式图像,我们需要将保存到硬盘上的文件格式转换成 webp;其次,截图完成后,剪贴板中的图像文件需要是 png 格式;最后,上传的文件需要是 webp 格式

重要的是 webp 的转换,ShareX 有一个很呆同时也很有用的 feature,在后面还有用处——如果选定了截图后 “执行操作”,那么在截图保存完成后和上传文件前,ShareX 会各执行一次符合要求的 action,也就是 “执行操作”,但是第二次的 action 使用和第一次相同的输入。后面我们会看到,如果我们在将 png 转换成 webp 并删除硬盘上的原文件后,如果第二次继续让 action 运行,那么将会因为找不到 png 文件而上传卡住……

首先我们先下载一个 ffmpeg…… 记住可执行文件的路径

接下来如此如此配置我们的第一个 action:

文件路径:选择ffmpeg的可执行文件路径
参数:-i %input -q 90 %output
(注意,这里-q后面的数字表示转换质量,100的话表示无损(吧))
输出文件拓展名:webp
拓展名过滤:png
(有了这个过滤,第二次运行action的时候将会跳过这一项)

勾选隐藏窗口和删除输入文件两项
  • 接下来我们需要配置一个监视文件夹,并且勾选子目录,和自动上传文件夹内的文件(实际使用中,你将只会向内放入长度合适的 mp4 文件,长度过长,将会很难编码到 5MB 以内
  • 接下来我们需要配置第二个 action 来实现 mp4->webp,同样需要过滤器帮忙:
文件路径:ffmpeg可执行文件路径
参数:-i %input -filter:v scale=480:-1 -q 75 -loop 65535 %output
(-loop 65565实现类似gif自动连播的功能)
(以上参数是我试验得到的,大约可以将30s的动漫视频编码到5MB以内webp)
输出拓展名:webp
拓展名过滤:mp4
勾选隐藏窗口和删除输入文件

完成后动作

最后需要编辑一下截图完成后的动作和上传完成的动作,注意途中字体变粗的部分即为选中部分:

最后的最后

自己摸索一下其他细枝末节的一些设置,改一下自己习惯的快捷键,就可以愉快使用了。

顺带一提,如果将录像 GIF 换成录像 mp4,并且使录像默认保存到之前的监控目录,就可以实现自动录制并转换为 webp 动图上传了。

Enjoy!


或许明日太阳西下倦鸟已归时