关于chatgpt:Mac-图片自动压缩上传-COS

10次阅读

共计 8635 个字符,预计需要花费 22 分钟才能阅读完成。

把集体博客放在了 netilfy 托管,它给了一个优化倡议,能够压缩图片节俭带宽。然而每次截图后都要再压缩下图片有点麻烦,于是想着应该能够 偷偷懒。指标很明确,截图后图片传到我的 git 仓库 images 目录后,能给我主动压缩,并且上传 COS,这样我就只用在 markdown 文件外面拼链接就好了。

关上 Web Browsing 性能的 GPT4,让他帮忙实现吧。

监听文件并压缩

Human:
在 mac 上,我有一个目录,想在目录外面增加文件的时候,主动对图片进行压缩,替换原来的文件。要怎么实现呢?

ChatGPT:
你能够通过应用 Automator(主动操作程序)来实现这个性能。Automator 是 Mac OS X 提供的一种弱小工具,能帮忙你主动执行各种工作。

以下是设置步骤:

  1. 关上 Automator(位于“应用程序”文件夹中)。
  2. 点击“新建文稿”,而后抉择“文件夹操作”。
  3. 在弹出的窗口中,抉择你要监督的文件夹。
  4. 在左侧面板中,找到并双击“缩放图片”。
  5. 在弹出的对话框中,设置你心愿的图片大小。
  6. 另外,你可能须要增加一个“复制 Finder 我的项目”操作,将原始图片复制到另一个中央,以防万一。你能够在左侧面板中找到并双击它。
  7. 最初,保留你的 Automator 工作流程。

这样,每当你向该文件夹增加图片时,Automator 都会主动将其缩放到你指定的大小,而后替换原来的图片。请留神,这个办法会笼罩原始图片,因而如果你不想失落原始图片,最好先做好备份。


Human:
这里我想用 https://imageoptim.com/command-line.html 中提到的 ImageOptim 来压缩图片,要怎么做呢

ChatGPT:
在应用 ImageOptim 命令行工具前,你须要先确保它曾经装置在你的 Mac 上。你能够通过以下命令装置它:

npm install -g imageoptim-cli

而后,你能够在 Automator(主动操作程序)中应用 Shell 脚本来调用 ImageOptim。以下是具体步骤:

  1. 关上 Automator(位于“应用程序”文件夹中)。
  2. 点击“新建文稿”,而后抉择“文件夹操作”。
  3. 在弹出的窗口中,抉择你要监督的文件夹。
  4. 在左侧面板中,找到并双击“运行 Shell 脚本”。
  5. 在弹出的对话框中,输出以下命令:

    for f in "$@"
    do
        /usr/local/bin/imageoptim "$f"
    done
  6. 最初,保留你的 Automator 工作流程。

这样,每当你向该文件夹增加图片时,Automator 就会主动调用 ImageOptim 命令行工具对其进行压缩,并替换原来的文件。

请留神,这个办法会笼罩原始图片,因而如果你不想失落原始图片,最好先做好备份。

也请留神,这个脚本假如你的 ImageOptim 命令行工具是通过 npm 装置的,且装置地位在 /usr/local/bin/。如果你的装置地位不同,你须要批改脚本中的门路。


Human:
我依照下面办法保留 Automator 之后,往步骤 3 外面的文件夹加了一个图片,然而并没有被压缩,是怎么回事呢?

ChatGPT:
这可能有几个起因,咱们能够进行以下排查:

  1. 确认你的 Automator 文件夹操作是否正确保留,并且指定的是正确的文件夹。
  2. 确认在 Automator 工作流程中增加的 “ 运行 Shell 脚本 ” 操作里的命令是否正确。特地要留神 ImageOptim 命令行工具的门路是否正确。
  3. 查看是否有权限问题。你可能须要给 Automator 工作流程足够的权限来批改文件夹中的图片。
  4. 最初,确保 ImageOptim CLI 工具曾经正确装置,并能够在 Terminal(终端)中间接运行。

如果以上步骤都无奈解决问题,你能够尝试在 Automator 的 “ 运行 Shell 脚本 ” 操作中增加一些调试代码,例如在命令中增加 echo “$f” 来查看正在解决的文件门路,或者在命令最初增加 2> /path/to/error.log 来将可能的谬误输入到一个日志文件。

这里真的超出预期了,间接教你打日志来排查问题,有点业余工程师的感觉。


Human:
我加了 2> /path/to/error.log,然而没有任何日志输入

ChatGPT:
如果没有任何日志输入,这可能表明你的 Automator 工作流程没有被正确触发,或者 “ 运行 Shell 脚本 ” 操作没有被正确执行。

我倡议你首先查看你的 Automator 工作流程是否被正确保留,并且关联到了正确的文件夹。你能够尝试从新创立一个新的文件夹操作,以确保所有的设置都是正确的。

而后,你能够在 “ 运行 Shell 脚本 ” 操作中增加一些简略的调试代码,例如 echo "Hello, world!" > /path/to/debug.log。而后再增加一个新的图片到文件夹中,看看是否有任何输入。

如果这个简略的测试也不能工作,那么问题可能出在 Automator 或者你的零碎设置上。你能够查看你的零碎设置,确保 Automator 有足够的权限来监督文件夹和批改文件。你也能够尝试在 Automator 中创立一个新的文件夹操作,看看是否有其余的操作可能被正确触发。

如果这个简略的测试能够工作,那么问题可能出在 ImageOptim CLI 工具或者你的 Shell 脚本上。你能够在 Terminal(终端)中手动运行雷同的 ImageOptim 命令,看看是否有任何谬误。


Human:
我的 shell 如下

echo "Hello, world!" >> ~/Desktop/error.log
for f in "$@"
do
    /Users/daemonzhao/.nvm/versions/node/v20.2.0/bin/imageoptim "$f"
done

2>> ~/Desktop/error.log

这里 error.log 只输入了 Hello, world!$@ 应该是空值。

这里前面又有几轮聊天,GPT4 开始并没有给出一个正确的答案。不过咱们能够信赖 GPT、而后验证 GPT 的内容。

换 Apple Script


Human:
Automator 的 Folder Actions,如何胜利拿到新增加的文件门路。下面你给出的办法拿不到,所以没法执行 shell 脚本

ChatGPT:
对不起刚刚的解答可能有些误导。在 Automator 的 “运行 Shell 脚本” 操作中,”$@” 是代表所有的参数,而在 Folder Actions 中,这些参数就是新增加到文件夹的文件门路。

不过,如果你的脚本中 “$@” 是空的,那么可能是因为 Automator 并没有正确地将文件门路作为参数传递给 Shell 脚本。

为了解决这个问题,你能够尝试应用 AppleScript 而不是 Shell 脚本来获取文件门路。你能够在 Automator 中增加一个 “ 运行 AppleScript” 操作,而后应用以下的代码:

on run {input, parameters}
    tell application "Finder"
        set filePath to the POSIX path of (input as alias)
        do shell script "/path/to/your/command" & filePath
    end tell
end run

这个 AppleScript 脚本会将新增加到文件夹的文件门路作为 input 参数传递给 run 函数,而后应用 Finder 来获取文件的 POSIX 门路,最初执行你的 Shell 命令。

留神你须要将 /path/to/your/command 替换为你想要执行的 Shell 命令,比方 ImageOptim CLI 的门路。你也能够在 do shell script 命令中增加其余的参数,比方文件门路。

这是一个实例,你能够依据你的须要进行批改。心愿这个办法可能解决你的问题!

最开始让用 shell script,始终拿不到减少的文件,这次换了 apple script,一下子就拿胜利了。


Human:
不能将“current application”转换为“alias”类型。

ChatGPT:
对不起,我犯了个谬误。在 AppleScript 中,input 参数是一个列表,示意所有传递给脚本的文件。如果你想要解决每个文件,你须要应用一个循环。这是一个批改后的脚本:

on run {input, parameters}
    repeat with i in input
        set filePath to POSIX path of i
        do shell script "/path/to/your/command" & quoted form of filePath
    end repeat
end run

这个脚本会遍历所有传递给脚本的文件,获取每个文件的 POSIX 门路,而后执行你的 Shell 命令。留神 quoted form of filePath 是用来确保文件门路在传递给 Shell 命令时被正确援用,这对于含有空格或其余特殊字符的文件门路是必要的。

你须要将 /path/to/your/command 替换为你想要执行的 Shell 命令,比方 ImageOptim CLI 的门路。你也能够在 do shell script 命令中增加其余的参数,比方文件门路。

这次终于胜利了,然而压缩速度有点慢。

更换压缩工具


Human:
除了 ImageOptim,mac 上还有其余收费的工具能够压缩图片吗?要求有较快的速度和较高的无损压缩比。

ChatGPT:
在 Mac 上除了 ImageOptim,你还有以下一些收费的图片压缩工具能够抉择:

  1. Preview:这是 Mac 自带的一个应用程序,能够用来压缩图片。你能够抉择单个或多个图片来进行压缩,办法是关上 Preview,而后点击顶部菜单栏的“文件”>“导出”。而后你能够抉择图片的格局,并通过调整品质滑块来压缩图片​1​。
  2. Mac 的 Photos 利用:你也能够应用 Mac 的 Photos 利用来压缩图片。你能够在 Photos 利用中抉择一张或多张照片,而后按 Command + Shift + E 或从顶部菜单栏点击“文件”>“导出”>“导出照片”来压缩图片​1​。
  3. 图片压缩利用:Mac App Store 有许多能够压缩图片的利用。比方你能够在 App Store 中搜寻“压缩图片”,就能够找到一些相干的利用 https://www.idownloadblog.com/2022/01/04/how-to-compress-imag…​1​。
  4. 在线图片压缩网站:你也能够抉择应用在线的图片压缩服务,比方 iLoveIMG.com 和 ShortPixel.com。这些在线服务能够方便快捷地压缩图片,但你须要留神的是,你上传的图片会被存储在这些网站的服务器上,所以对于蕴含集体或敏感信息的图片,倡议应用离线的压缩办法​1​。

这里用了 browsing 性能,GPT 本人去网上搜寻。


Human:
我想找的是能在 mac 本地命令行运行的压缩图片工具,你有啥倡议的

ChatGPT:
在 Mac 上,有一些命令行工具能够用来压缩图片:

  1. jpegoptim:这是一个用来优化和压缩 JPEG 图片的命令行工具。你能够应用 Homebrew 来装置它,命令是 brew install jpegoptim。压缩一个 JPEG 图片的命令是 jpegoptim –size=100k your_image.jpg,这会将 your_image.jpg 压缩到 100KB 或更小的大小。
  2. optipng:这是一个 PNG 图片优化工具,能够通过命令行应用。装置命令是 brew install optipng。应用 OptiPNG 压缩图片的命令是 optipng -o7 your_image.png,这会应用最高级别的优化选项来压缩 your_image.png。
  3. pngquant:这是另一个用于 PNG 图片的命令行工具,能够创立具备大量色彩的优质 PNG 图片,从而大大减小文件大小。装置命令是 brew install pngquant。压缩 PNG 图片的命令是 pngquant your_image.png,这会创立一个新的,压缩后的 PNG 图片。

所有这些工具都须要通过命令行来应用,并且能够在脚本中应用,以便于批量解决图片。然而请留神,每个工具都有其本人的一套参数和选项,你可能须要浏览各自的文档来更好地了解如何应用它们。


Human:
我想用 pngquant,我用 brew install pngquant 装置后,如何更改 下面 apple script 的脚本呢

ChatGPT:
你能够将 AppleScript 脚本批改为如下模式,以应用 pngquant 工具:

on adding folder items to this_folder after receiving added_items
    try
        tell application "Terminal"
            repeat with i from 1 to number of items in added_items
                set this_item to item i of added_items
                do shell script "/usr/local/bin/pngquant --force --ext .png" & quoted form of POSIX path of this_item
            end repeat
        end tell
    end try
end adding folder items to

这段脚本在新的文件增加到文件夹时,会应用 pngquant 来压缩这些文件。–force 选项使得 pngquant 在文件曾经存在时会笼罩它,而 –ext .png 选项会使得输入文件的扩大名为 .png。

请留神,你可能须要依据 pngquant 在你的零碎上的理论装置地位来批改脚本中的 /usr/local/bin/pngquant。你能够通过在终端运行 which pngquant 命令来找到 pngquant 的理论门路。

同样,你须要依据理论状况来调整 pngquant 的参数。例如,如果你想要指定压缩级别,你能够增加 -quality 参数,如 –quality 60-80。你能够参考 pngquant 的文档来理解更多的参数和选项。

增加图片前缀


Human:
我想在脚本中改一下压缩后的文件名,在每个文件明后面加上日期前缀,比方 20230601_,要怎么做呢?

ChatGPT:
为了实现这个性能,你须要获取以后日期,而后格式化为你须要的格局。而后,你能够将这个日期前缀增加到文件名中。你能够应用 do shell scriptdate 命令来获取和格式化日期,而后应用 text item delimiters 来批改文件名。以下是你能够尝试的 AppleScript:

on run {input, parameters}
    tell application "System Events"
        set currentDate to do shell script "date'+%Y%m%d'"
        repeat with i in input
        ...
        end repeat
    end tell
end run

这个脚本首先获取以后日期,并将其格式化为 “YYYYMMDD” 的模式。而后,对于每个输出文件,它查看扩展名是否为 “png”。如果是,它获取文件名,将其合成为根本名称和扩展名,而后将日期前缀增加到根本名称。而后,它将文件重命名为新的文件名,而后应用新的文件门路来执行 pngquant 命令。

这里有坑,因为没写过 apple script,也懒得去看代码。后果这里代码死循环增加前缀,两头和 GPT 交换了几轮,改了几遍代码,有点不顺。最初提醒让 GPT 一步步来思考,居然能够啦。


Human:
还是不行,你从新一步步思考下这个步骤,而后给出一个正确的代码

ChatGPT:
我明确你的问题了,的确是我之前的脚本存在问题。因为每次增加文件到文件夹,Folder Action都会触发一次,解决文件夹中所有的文件。如果同时增加了多个文件,这个 Folder Action 就会被屡次触发,解决的对象包含曾经解决过的文件,这就导致了问题。

咱们能够批改脚本,使得它只解决那些没有被解决过的文件。具体来说,咱们能够查看文件名是否曾经蕴含了日期前缀,如果蕴含,咱们就跳过这个文件。

另外,咱们应该在压缩文件后立刻重命名文件,而不是在压缩前。因为 pngquant 工具会间接笼罩原文件,如果咱们先重命名再压缩,原文件就不会被压缩,而新文件会保留原来的大小。

上面是批改后的脚本:

on run {input, parameters}
    set currentDate to do shell script "date'+%Y%m%d'"tell application"System Events"
        repeat with i in input
        ...
        end repeat
    end tell
end run

这个脚本应该能够解决你的问题。它只会解决那些没有被解决过的.png 文件,并且在压缩文件后立刻重命名文件。同时增加的多个文件也不会造成问题。

这次能够主动压缩重命名了,还想再主动传到 COS 上。

上传 COS

Human:
在下面的改名字和压缩步骤实现后,我想把图片传到 Tencent cos 的某一个 bucket 中,要怎么做呢?

ChatGPT:
首先,你须要在本地装置腾讯云的命令行工具 COSCMD,你能够应用以下命令进行装置:pip install coscmd

而后,你须要配置你的 COSCMD。运行以下命令并依照提醒输出你的腾讯云 API 密钥(SecretId 和 SecretKey)以及你的地区(Region)和默认的存储桶(Bucket):

coscmd config -a <SecretId> -s <SecretKey> -b <Bucket> -r <Region>

在下面的命令中,<SecretId>,<SecretKey>,<Bucket> 和 <Region> 是你须要替换的局部。例如,你可能须要这样:

coscmd config -a AKIDxxxxxxxx -s xxxxxxxx -b mybucket-1250000000 -r ap-beijing

当初,你能够在 AppleScript 中应用 do shell script 命令来调用 COSCMD 并将文件上传到你的存储桶中。你能够应用 coscmd upload 命令来上传文件,如下所示:

do shell script "coscmd upload" & quoted form of filePath & "/"

所以,你的 AppleScript 可能看起来像这样:

on run {input, parameters}
    set currentDate to do shell script "date'+%Y%m%d'"tell application"System Events"
        repeat with i in input
            set filePath to POSIX path of i
            set fileExtension to name extension of i
            ...
        end repeat
    end tell
end run

在这个脚本中,咱们在重命名文件后获取新的文件门路,并将其上传到 COS。留神,你须要确保你的计算机上曾经装置了 Python 和 pip,并且你的腾讯云 API 密钥、Bucket 和 Region 都是正确的。你还须要确保你的 Bucket 容许你上传文件。

这里本人搞错了几个中央,不过 GPT 提醒加了 log,而后也很快定位到了。

最终后果

最终脚本如下:

on run {input, parameters}
    set currentDate to do shell script "date'+%Y%m%d'"tell application"System Events"
        repeat with i in input
            set filePath to POSIX path of i
            set fileExtension to name extension of i
            set folderName to do shell script "dirname" & filePath
            if fileExtension is "png" then
                set fileName to name of i
                set AppleScript's text item delimiters to"."
                set baseName to first text item of fileName
                if baseName does not start with currentDate then
                    do shell script "/opt/homebrew/bin/pngquant --force --ext .png" & quoted form of filePath
                    set newBaseName to currentDate & "_" & baseName
                    set newFileName to newBaseName & "." & fileExtension
                    set name of i to newFileName
                    set newFilePath to folderName & "/" & newFileName
                    set uploadCommand to "/opt/homebrew/Caskroom/miniconda/base/bin/coscmd upload" & quoted form of newFilePath & "/"
                    do shell script uploadCommand
                end if
            end if
        end repeat
    end tell
end run

实现的后果,指定一个目录,前面往这个目录新减少的 png,都主动压缩,在前缀加上以后日期,而后传输到腾讯云 COS 上。残缺的对话在这里。

本文由 selfboot 发表于集体博客,采纳署名 - 非商业性应用 - 雷同形式共享 3.0 中国大陆许可协定。
非商业转载请注明作者及出处。商业转载请分割作者自己
本文题目为:Mac 图片主动压缩上传 COS
本文链接为:https://selfboot.cn/2023/06/02/auto_compress_upload/

正文完
 0