作家不仅要处理文字,他们还经常要处理图像。技术写作涉及展示大量屏幕截图以传达技术和流程。不同的发布平台可能对图像有不同的要求,例如图像格式或文件大小。
作为一名 IT 顾问和系统工程师,我为客户交付编写了大量技术文档,通常以 Microsoft Word (.doc) 作为所需格式。随着内容的添加,任何文档都可能快速增长。早期,屏幕截图通常是位图 (.bmp),它可能具有非常大的文件大小。描述在服务器上安装操作系统的文档最终可能是一个非常大的文件。
在不使图像难以辨认的情况下缩小图像尺寸是一项费力的工作。位图可以转换为 jpeg 文件,后来又转换为 png 文件。即使在我将办公套件切换到 LibreOffice 后,编辑仍然是一个挑战。幸运的是,如今大多数屏幕截图工具都以较小的格式保存,例如 png。
Opensource.com 对其文章中使用的图像设置了某些限制。我开发了一种快速的三步方法来准备我的文章的图像。第一步是明智地进行分期,例如调整窗口大小或更改字体。另外两个步骤变得非常重复。这些步骤是确保图像不超过 600 像素的宽度限制并应用边框。
prepimg.sh 脚本
我编写了一个名为 prepimg.sh
的 Bash 脚本来处理这些任务。此脚本使用了 ImageMagick 套件中的两个工具。
调整图像大小
屏幕截图实用程序将图像以通用名称保存到 Pictures
目录中,例如 Screenshot-20210923222312.png
。我的 prepimg.sh
脚本检查此目录中文件的像素宽度,并调整任何超过限制的文件的大小。此步骤使用 ImageMagick 套件中的 identify 程序来确定宽度 (%w)。
$ identify -format %w Screenshot-20210903202655.png
1217
宽度值被分配给变量 W
,用作与 600 限制的比较器。限制本身可以通过变量 $MAXWIDTH
配置。如果确定宽度超过 MAXWIDTH,则调用另一个名为 convert 的 ImageMagick 程序来减小图像的宽度。这是我的脚本中的图像处理函数
if [ "$W" -gt "$MAXWIDTH" ]
then
[[ $VERBOSE -gt 0 ]] && echo "${1} is ${W} - reducing"
convert -resize "${MAXWIDTH}" \
"${SCREENSHOTS}"/"${1}" \
"${READY}"/"${1}"
...
图像根据需要缩小尺寸并保存到 $READY
变量定义的另一个目录。在这种情况下,图像实际上被调整得略小一些——598 像素——以便为添加边框留出空间,我将在下面展示。
向图像添加边框
有时图像可能看起来融入了网页的背景。这是因为图像的前景色一直到边缘与站点的背景颜色相同。这是一个例子

一张没有边框的图像。(CC BY-SA 4.0)
正如您在上面的图像中看到的那样,不可能分辨出图像的边缘在哪里。这个问题不仅限于白色。它取决于每个网站及其使用的主题颜色。因此,如果背景是红色,图像边缘也是红色,则也会发生同样的问题。我的脚本通过使用 convert 工具解决了这个问题。-border 选项为每个图像文件添加一个 1 像素大小的边框。这个选项本身就足够了,但我也想使用 -bordercolor 选项设置颜色。这是一个例子
convert -bordercolor black -border 1 Screenshot-20210903202655.png
下面是同一张带有边框的图像。看起来是不是更漂亮?

一张带有边框的图像。(CC BY-SA 4.0)
您的图像已准备就绪
我使用 for
循环遍历屏幕截图目录。它为每个文件调用函数 process_img
。该函数处理宽度和边框。完整代码进行了一些健全性检查,例如确保文件实际上是图像。
process_img() {
# verify that file is an image file, and then get dimensions
if file "${SCREENSHOTS}"/"${1}" | grep -qE 'image|bitmap'; then
[[ $VERBOSE -gt 0 ]] && echo "${1} is an image"
W=$(identify -format %w "${SCREENSHOTS}"/"${1}")
else
echo "File ${SCREENSHOTS}/${1} is not an image."
W=0
fi
# resize and border
if [ "$W" -gt "$MAXWIDTH" ]
then
[[ $VERBOSE -gt 0 ]] && echo "${1} is ${W} - reducing"
convert -resize "${MAXWIDTH}" \
-bordercolor $BORDER \
-border 1 \
"${SCREENSHOTS}"/"${1}" \
"${READY}"/"${1}"
else
convert -bordercolor $BORDER \
-border 1 \
"${SCREENSHOTS}"/"${1}" \
"${READY}"/"${1}"
fi
}
脚本的最后一步是将处理后的文件保存在名为 Ready
的子目录中,该子目录由名为 $READY
的变量确定。这保留了原始文件以供进一步使用。
用法
Prepimg.sh
包括预期的帮助工具,描述其参数及其用法
$ prepimg.sh -h
prepimg.sh Version 0.7 - written by Alan Formy-Duval
prepimg.sh [OPTIONS]
--verbose, -v Be verbose
--directory, -d Screenshot directory (default: /home/alan/Pictures/Screenshots)
--ready, -r Ready directory (default: /home/alan/Pictures/Screenshots/Ready)
--border, -b Border color (default: black)
代码和结论
本文中提供的代码不完整,应视为伪代码。您可以在我的 Git 存储库中查看完整脚本。
ImageMagick 套件是一组用于处理图像的强大工具。除了我的小脚本中包含的功能外,您还可以做更多的事情。通讯员 Jim Hall 最近也写了一篇关于使用它来调整图像大小的文章。
无论您喜欢 Bash 脚本还是使用另一种语言(如 C 或 Python)进行编码,自动化都是一个很大的帮助。一次又一次,我看到一点代码如何减少如此多的麻烦,并使我们能够更好地利用我们的时间。
5 条评论