使用快速操作自动更改图像宽度并调整高度

Change width of image and adjust height automatically with Quick Action

如果您有图像文件,您可以执行以下操作:

看起来像这样:

这将改变图像的宽度并自动调整高度,而不剪切图像。

我想为我创建一个快速操作:将宽度更改为 100 像素并自动调整高度。

是否可以使用 Automators Quick Action 编辑器来做到这一点?

on run {input, parameters}
    set targetWidth to 100
    repeat with anAlias in (get contents of input)
        set hfsPath to anAlias as text
        try
            tell application "Image Events"
                launch
                set anImage to open (file hfsPath)
                set {w, h} to dimensions of anImage
                if w > h then
                    scale anImage to size targetWidth
                else
                    scale anImage to size (round (targetWidth * h / w) rounding up)
                end if
                save anImage with icon
                close anImage
            end tell
        on error error_message
            display dialog error_message
        end try
    end repeat
    return input
end run
  1. 打开 Automator
  2. Select 创建快速操作
  3. 设置“工作流在Finder.app中接收图像文件”
  4. 使用上述内容添加 运行 AppleScript 动作。
  5. 保存(此服务)

sips 是特定于 Mac 的 Apple 编写的命令行程序,具有一些基本的图像处理操作。 --resampleWidth 选项可以满足您的需要。 (可以通过终端内的 man sips 获得更多关于 sips 可以做什么的详细信息。)

sips 命令会将图像调整为您想要的大小:

sips --resampleWidth 100 path/to/image.png

要在 Automator 中使用它,我们可以将其包装在以下代码中:

for f in "$@"
do
    sips --resampleWidth 100 "$f"
done

然后可以使用 运行 Shell Script Automator 操作触发:

Notes/caveats

  1. 如果原始图像小于 100px 宽,此命令 会将其缩放为比原来.

  2. 此外,正如评论中指出的那样,使用 sips 可能会导致 原始图像中的一些元数据不存在 缩放副本.

旋转问题?

在评论中建议 sips 不能正确处理旋转 90°(/270°) 的图像。我对此进行了测试,它似乎按预期工作,两种情况下输出图像的宽度均为 100。

测试的图像使用预览进行了旋转。我的理解是图像旋转有两种类型:

  1. 重新保存图像,所有像素都在新的旋转位置。
  2. 像素数据不变,在图像中添加数据表示'read in all the pixel data, then before you display it, translate everything (e.g.) 90°'。

第二种方法避免了重新保存,这对于有损格式可能会有问题,因为多次旋转每次都会丢失数据,即四次旋转将不会以原始数据结束再次。我依稀记得使用 sips 进行此类图像旋转时出现的一些问题,但在我看来,它现在可能已得到修复。我正在使用 sips 的 build 294 [通过在终端中输入 sips -v 显示] 和 Mac OS Catalina (10.15.7).

为了确定,我建议使用 JPEG 等有损格式进行测试,看看 Preview/sips 在旋转时的表现是否不同。