【问题标题】:Change width of image and adjust height automatically with Quick Action使用快速操作自动更改图像宽度和调整高度
【发布时间】:2021-11-17 11:16:24
【问题描述】:

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

  • 在 Apples Preview 应用中打开文件
  • 转到:工具>调整大小...
  • 选中“按比例缩放”
  • 将“宽度:”中的值更改为 100 像素

看起来像这样:

这会改变图片的宽度并自动调整高度,不会剪切图片。

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

是否可以使用 Automators 快速操作编辑器来做到这一点?

【问题讨论】:

  • 回答您实际提出的问题:“是否可以使用 Automators 快速操作编辑器做到这一点?” - 是的。如果您在 Automator 中搜索“调整大小”,希望从那时起应该相当清楚。
  • @user16966757 这不是我想要的,因为它会剪切图像(或有时会增加一些空间)而不是调整高度。
  • 阅读我的答案(脚本下带有 cmets),了解如何正确设置 Automator 服务。
  • @RobertKniazidis 谢谢,我做到了,但我得到了错误:Cannot read item 1 of {}
  • 在运行服务之前,您应该在 Finder 中选择一些图像文件

标签: macos applescript automator


【解决方案1】:

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

这可以通过 Run Shell Script Automator 动作触发:

注意事项/注意事项

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

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

旋转问题?

在 cmets 中,建议 sips 不适用于旋转 90°(/270°) 的图像。我对此进行了测试,它似乎按预期工作,两种情况下输出图像的宽度都是 100。

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

  1. 图像重新保存,所有像素都位于新的旋转位置。
  2. 像素数据没有改变,并且数据被添加到图像中,表示“读取所有像素数据,然后在显示之前,将所有内容平移(例如)90°”。

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

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

【讨论】:

  • 这个OP问题在我回答之前被大家遗忘了。此外,未完成的“解决方案”立即涌入。此外,OP 在另一篇文章中抱怨 sips 删除了一些元数据。无论宽度或高度是否更大,您至少可以使您的脚本正确缩放。或者不要在你的知识有限的地方干涉。
  • 另外,如果图像旋转 90 度,sips 会错误地检测高度和宽度。
  • @RobertKniazidis 巧合的时机 - 今天恰好出现在我的列表顶部,我自己也解决了一个类似的问题(我想!)使用内置的 Automator 操作。你提醒我内置的调整大小是最长的尺寸而不是具体的高度(OP同时指出)让我停止使用我的手机并去看看我写的动作来做几乎相同的工作年前。关于元数据的好点 - 将其添加到我的答案中。谢谢。
  • @RobertKniazidis 我用旋转 90° 的图像对此进行了测试,我觉得它看起来不错。
  • 这取决于旋转图像的宽度。但既然 OP 已经决定你的剧本是他想要的,我想到此结束。
【解决方案2】:
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. 打开自动机
  2. 选择创建快速操作
  3. 设置“工作流在Finder.app中接收图片文件”
  4. 添加带有上述内容的运行 AppleScript 操作。
  5. 保存(此服务)

【讨论】:

  • @RobertKniazidis 我得到:„Cannot read item 1 of {}“
  • 我没有测试过,但可能嵌入的 Automator 动作按最大尺寸而不是按宽度缩放。
  • @RobertKniazidis - 是的,你是对的,确实如此
  • 这里的问题可能不是因为输入错误,而是因为图像事件没有被授予全磁盘访问权限,所以图像事件无法访问 dimensions(或其他任何东西)。这会影响 Catalina 10.15,可能还会影响更高的操作系统版本。问题描述为in the Apple forums,文章底部有修复,或跳过straight to the fix。授予权限后,此解决方案适用于我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
相关资源
最近更新 更多