感谢大家提意见。已经用 exiftool 搞定了(这么好用的的东西现在才知道!
我是在一个 alpine 容器里操作的。以前写过这篇文章 [可能是]最好的压缩图片程序,使用 squoosh-cli 批量压缩图片 https://hellodk.cn/post/1141
使用 alpine 安装 exiftool, apk add exiftool,
squoosh-cli 批量压缩
squoosh-cli --mozjpeg '{"quality":60,"baseline":false,"arithmetic":false,"progressive":true,"optimize_coding":true,"smoothing":0,"color_space":3,"quant_table":3,"trellis_multipass":false,"trellis_opt_zero":false,"trellis_opt_table":false,"trellis_loops":1,"auto_subsample":true,"chroma_subsample":2,"separate_chroma_quality":false,"chroma_quality":75}' \
-d output \
-s -dk-compressed \
*.jpg
再调用一个 shell 脚本即可将原本文件的 exif info 写入 squoosh 压缩后的文件当中。squoosh压缩后文件占用 163KB,写入 exif 信息之后文件占用变成 172KB,可以接受。
shell 内容如下
#!/bin/sh
# 检查是否提供了必要的参数
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Usage: $0 <input_dir> <output_dir>"
exit 1
fi
# 从命令行参数中读取输入目录和输出目录
input_dir="$1"
output_dir="$2"
# 检查输入目录是否存在
if [ ! -d "$input_dir" ]; then
echo "Input directory '$input_dir' does not exist."
exit 1
fi
# 检查输出目录是否存在
if [ ! -d "$output_dir" ]; then
echo "Output directory '$output_dir' does not exist, creating it."
exit 1
fi
# 定义原始图片目录和输出目录
input_dir="."
output_dir="./output"
# 遍历所有 JPG 文件
for input_file in "$input_dir"/*.jpg; do
# 提取文件名,不带路径
filename=$(basename "$input_file")
# 构建目标文件路径
output_file="${output_dir}/${filename%.jpg}-dk-compressed.jpg"
# 检查压缩后的文件是否存在,以防万一
if [ ! -f "$output_file" ]; then
echo "File $output_file does not exist, skipping..."
continue
fi
# 复制 EXIF 元数据
exiftool -TagsFromFile "$input_file" -all:all "$output_file"
# 删除生成的备份文件(-TagsFromFile 操作会创建一个备份文件)
rm "${output_file}_original"
done