乍听之下,不无道理;仔细揣摩,胡说八道

0%

让斗图赢在起跑线上

序言

以前用Windows的时候,我在QQ中添加了很多自定义表情,其中有很多我还为它们设置了短语,以便可以便捷地发出去。后来微信用得多了,也在微信中收集了很多的表情。很多时候,表情包真的是一图胜千言,而且比起直白地说出同样的话,发图片显得更有意思。比如说,某一天你的同事在谈论他朋友的一些事情时,你可以发一张

当然了,很多时候可能手头没有这张图片,或者一时找不到,也可以来一句“你说的这个朋友到底是不是你自己.jpg”,异曲同工。每每遇到这些有趣的图片的时候,我便会将它们保存下来以备不时之需。不过收集得多了之后,在想要用的时候便发现找表情也不是一件特别容易的事情。比如说,我的表情包目录中已经有92张图片了,即便我明确地知道我要找的就是上面这张图,文件名也没记错,但要在九十多张图片中一眼看到它,还是颇具难度的。

好在,咱是程序员,在很多事情上可以动动手指写写代码来予以辅助——找表情图片这件事情,恰好是其中之一。

准备素材

首先,我要祭出神器Alfred。我会编写一个Alfred的Workflow,它起码要能够方便我按名字找到图片,并且能够复制到粘贴板中。这么一来,我就可以直接在IM软件的聊天窗口中发出选好的表情图。

其次,正所谓巧妇难为无米之炊,如果没有表情图片的储备,那制作这么个工具也就毫无意义了。因此,我还得准备一个目录,用来存放所有将来可能会用上的图片文件,这个目录便是~/OneDrive/图片/表情包。OneDrive上1TB的存储空间,放点图片也是绰绰有余了——当然了,也不是非要把图片目录放到一个同步网盘里。

最后,这些搜集回来的图片还不能就这么晾着,必须给它们取一些容易记忆的名字,毕竟之后就靠名字来找它们了。给表情图片文件命名很简单,因为许多图片中含有一两句关键的话。比如说,下面这张图

直接用图中的文字来命名即可。

编写Workflow

现在可以开始编写Workflow了。它的最终形态是下图这样的

作为Workflow入口的是一个keyword为bqbFile FilterFile Filter是一个挺强大的工具,它本身就可以完成我所需要的功能,见如下演示

可见,File Filter本身便足矣完成搜索图片并复制到粘贴板的需求,本篇文章也就到此为止了——才怪,光有File Filter还不够,因为收集回来的表情图片的尺寸并不统一,直接在IM工具中发送的效果并不好,可能有霸屏之嫌。比如文章开头的图片,用来自ImageMagick套件的identify程序可以看到这张图片足足有527像素宽405像素高,一下子占据了半个聊天窗口——群聊的时候,还是应当照顾一下群里其他人的感受的。

因此,Workflow中的第二个对象,便负责将图片缩放为合适的尺寸。第二个对象是一个Run Script Action,Alfred在运行后第一个File Filter后便会接着调用这个对象中所指定的外部脚本。这个对象的配置如下图所示

其中的脚本内容如下

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# 将图片等比缩放为300像素的宽度

filename=$(basename "${1}")
suffix="${filename##*.}"
if [ "${suffix}" = 'gif' ]
then
echo -n "${1}"
else
sips --resampleWidth 300 "${1}" --out /tmp > /dev/null 2>&1
echo -n "/tmp/${filename}"
fi

运行这个脚本后,便可以在/tmp目录下得到与原始图片同名的、宽度缩放为300像素的新图片。刚开始我也打算处理.gif文件,但试验后发现sips把GIF缩放成了一张静态图,于是便不处理GIF文件了。

第三个对象很简单,是一个Argument and Variables Utility,配置很简单,直接上图比较直观

第四个对象又是一个Run Script Action,用于将缩放后的图片复制到粘贴板中——没错,这本来是File Filter完成的工作。这个对象同样会调用一个External Script,内容如下

1
2
3
#!/bin/bash
cd /Users/liutos/SourceCode/applescript/
osascript copy_file_to_clipboard.scpt ${1}

咦,复制文件到粘贴板的逻辑呢?别着急,在/Users/liutos/SourceCode/applescript/copy_file_to_clipboard.scpt这个文件中,内容如下

1
2
3
4
5
#!/usr/bin/osascript
# 方法来自这里:https://superuser.com/questions/1132777/copy-an-image-to-clipboard-from-the-mac-terminal
on run args
set the clipboard to POSIX file (first item of args)
end run

它借助AppleScrippt来实现复制文件的功能。

最后一个对象是Alfred内置的Post Notification,用于在一切就绪后在右上角弹出提醒,反馈给Workflow的使用者,它的配置如下图所示

至此,这个集查找、缩放,以及复制图片于一身的Workflow,便大功告成了。怎样?是不是已经跃跃欲试了?

后记

等跃跃欲试的感觉褪去后便会发现,这个Workflow还相当地不成熟:

  1. 使用AppleScript复制文件后,只要在IM软件中一粘贴便会立即发送出去,让人有点猝不及防。我希望的效果,是类似于在浏览器中右键复制一张图片那般的;
  2. 它基于Alfred的File Filter来查找目录下的文件,但File Filter的搜索能力并非很强。虽然从上面的动图看来,它支持以拼音来搜索,但很多时候稍微多打几个字母,便什么结果也没有了。如果可以支持模糊查找,甚至全文搜索乃是极好的;
  3. 表情图片的文件名需要自己维护,每次收集到新的表情时都需要自己手打显诚意。若是有一个配套的工具可以从图片中提取出文字来自动命名便更好了——OCR了解一下?;
  4. 最后,当收集的表情图片多起来后,许多图片便不好找了,毕竟谁也无法很容易地记忆九十多张图片的名字。渐渐地,很多图片的使用率也会下降,变成了鸡肋。而当它们真的派上用场的时候,早已忘记了它们正静静地躺在目录下等待召唤。或许,我需要一个可以自动阅读我的聊天内容并向我推荐表情图的AI助理?

等哪天有空了,说不定我会按上面的思路稍微改进一下吧,哈哈。

Liutos wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
你的一点心意,我的十分动力。