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

从一个图床说起

在某论坛有一个很神奇的现象,很多人都喜欢购买大容量的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!

Last modification:March 8, 2020
(๑´ڡ`๑)