共计 8635 个字符,预计需要花费 22 分钟才能阅读完成。
把集体博客放在了 netilfy 托管,它给了一个优化倡议,能够压缩图片节俭带宽。然而每次截图后都要再压缩下图片有点麻烦,于是想着应该能够 偷偷懒。指标很明确,截图后图片传到我的 git 仓库 images 目录后,能给我主动压缩,并且上传 COS,这样我就只用在 markdown 文件外面拼链接就好了。
关上 Web Browsing 性能的 GPT4,让他帮忙实现吧。
监听文件并压缩
Human:
在 mac 上,我有一个目录,想在目录外面增加文件的时候,主动对图片进行压缩,替换原来的文件。要怎么实现呢?
ChatGPT:
你能够通过应用 Automator(主动操作程序)来实现这个性能。Automator 是 Mac OS X 提供的一种弱小工具,能帮忙你主动执行各种工作。
以下是设置步骤:
- 关上 Automator(位于“应用程序”文件夹中)。
- 点击“新建文稿”,而后抉择“文件夹操作”。
- 在弹出的窗口中,抉择你要监督的文件夹。
- 在左侧面板中,找到并双击“缩放图片”。
- 在弹出的对话框中,设置你心愿的图片大小。
- 另外,你可能须要增加一个“复制 Finder 我的项目”操作,将原始图片复制到另一个中央,以防万一。你能够在左侧面板中找到并双击它。
- 最初,保留你的 Automator 工作流程。
这样,每当你向该文件夹增加图片时,Automator 都会主动将其缩放到你指定的大小,而后替换原来的图片。请留神,这个办法会笼罩原始图片,因而如果你不想失落原始图片,最好先做好备份。
Human:
这里我想用 https://imageoptim.com/command-line.html 中提到的 ImageOptim 来压缩图片,要怎么做呢
ChatGPT:
在应用 ImageOptim 命令行工具前,你须要先确保它曾经装置在你的 Mac 上。你能够通过以下命令装置它:
npm install -g imageoptim-cli
而后,你能够在 Automator(主动操作程序)中应用 Shell 脚本来调用 ImageOptim。以下是具体步骤:
- 关上 Automator(位于“应用程序”文件夹中)。
- 点击“新建文稿”,而后抉择“文件夹操作”。
- 在弹出的窗口中,抉择你要监督的文件夹。
- 在左侧面板中,找到并双击“运行 Shell 脚本”。
-
在弹出的对话框中,输出以下命令:
for f in "$@" do /usr/local/bin/imageoptim "$f" done
- 最初,保留你的 Automator 工作流程。
这样,每当你向该文件夹增加图片时,Automator 就会主动调用 ImageOptim 命令行工具对其进行压缩,并替换原来的文件。
请留神,这个办法会笼罩原始图片,因而如果你不想失落原始图片,最好先做好备份。
也请留神,这个脚本假如你的 ImageOptim 命令行工具是通过 npm 装置的,且装置地位在 /usr/local/bin/
。如果你的装置地位不同,你须要批改脚本中的门路。
Human:
我依照下面办法保留 Automator 之后,往步骤 3 外面的文件夹加了一个图片,然而并没有被压缩,是怎么回事呢?
ChatGPT:
这可能有几个起因,咱们能够进行以下排查:
- 确认你的 Automator 文件夹操作是否正确保留,并且指定的是正确的文件夹。
- 确认在 Automator 工作流程中增加的 “ 运行 Shell 脚本 ” 操作里的命令是否正确。特地要留神 ImageOptim 命令行工具的门路是否正确。
- 查看是否有权限问题。你可能须要给 Automator 工作流程足够的权限来批改文件夹中的图片。
- 最初,确保 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,你还有以下一些收费的图片压缩工具能够抉择:
- Preview:这是 Mac 自带的一个应用程序,能够用来压缩图片。你能够抉择单个或多个图片来进行压缩,办法是关上 Preview,而后点击顶部菜单栏的“文件”>“导出”。而后你能够抉择图片的格局,并通过调整品质滑块来压缩图片1。
- Mac 的 Photos 利用:你也能够应用 Mac 的 Photos 利用来压缩图片。你能够在 Photos 利用中抉择一张或多张照片,而后按 Command + Shift + E 或从顶部菜单栏点击“文件”>“导出”>“导出照片”来压缩图片1。
- 图片压缩利用:Mac App Store 有许多能够压缩图片的利用。比方你能够在 App Store 中搜寻“压缩图片”,就能够找到一些相干的利用 https://www.idownloadblog.com/2022/01/04/how-to-compress-imag…1。
- 在线图片压缩网站:你也能够抉择应用在线的图片压缩服务,比方 iLoveIMG.com 和 ShortPixel.com。这些在线服务能够方便快捷地压缩图片,但你须要留神的是,你上传的图片会被存储在这些网站的服务器上,所以对于蕴含集体或敏感信息的图片,倡议应用离线的压缩办法1。
这里用了 browsing 性能,GPT 本人去网上搜寻。
Human:
我想找的是能在 mac 本地命令行运行的压缩图片工具,你有啥倡议的
ChatGPT:
在 Mac 上,有一些命令行工具能够用来压缩图片:
- jpegoptim:这是一个用来优化和压缩 JPEG 图片的命令行工具。你能够应用 Homebrew 来装置它,命令是 brew install jpegoptim。压缩一个 JPEG 图片的命令是 jpegoptim –size=100k your_image.jpg,这会将 your_image.jpg 压缩到 100KB 或更小的大小。
- optipng:这是一个 PNG 图片优化工具,能够通过命令行应用。装置命令是 brew install optipng。应用 OptiPNG 压缩图片的命令是 optipng -o7 your_image.png,这会应用最高级别的优化选项来压缩 your_image.png。
- 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 script
和 date
命令来获取和格式化日期,而后应用 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/