Skip to main content

可自定义压缩力度的批量压缩脚本

以下是使用 -q 参数(颜色质量)替换 --cq-level 的脚本版本。此参数的范围是 0 到 100,其中 100 是最高质量(无损),数字越低质量越低、文件越小。

#!/bin/bash

# 自定义压缩质量参数
# 你可以根据需求调整这个值,范围一般为 0 到 100
# 其中 100 是最高质量(无损),0 是最低质量(文件小,但视觉效果差)
Q_PARAM=80 # 默认设置为 80(高质量)

# 创建 output 目录
mkdir -p output

# 遍历当前目录下的各种大小写形式的 PNG 和 JPEG 文件
for file in *.png *.PNG *.jpg *.JPG *.jpeg *.JPEG; do
# 检查文件是否存在(避免没有匹配的文件时报错)
if [[ -f "$file" ]]; then
# 获取文件名(不含扩展名)用于输出文件名
filename="${file%.*}"
# 设定输出文件路径
avif_output="output/$filename.avif"

# 检查是否已存在转换后的文件,若存在则跳过
if [[ -f "$avif_output" ]]; then
echo "文件已转换,跳过: $file"
continue
fi

# 使用 avifenc 进行转换,采用自定义的压缩质量
avifenc -q "$Q_PARAM" "$file" "$avif_output" 2> /dev/null
fi
done

echo "转换完成。"

参数说明

  • Q_PARAM 默认值为 80,可根据需求修改。常见推荐值:
    • 100:无损压缩,文件较大。(不推荐使用无损,个别图片会比原PNG文件还增大几倍的容量)
    • 80-90:高质量,适合保留细节和图像清晰度。(如描述所说 属于对图片质量还是有点要求 但又想降低容量大小的)
    • 50-70:中等质量,文件较小且视觉效果尚可。(推荐的力度 另外一个脚本差不多就是这个效果 什么参数都不带 默认就挺不错了)
    • 30 以下:低质量,文件很小但视觉效果较差。(已测试 确实如描述所说)

无损压缩

当使用 -q 100 进行无损压缩时,AVIF 文件实际上可能变得比源文件大,这主要是因为:

  1. AVIF 格式特性:AVIF 是一种基于 AV1 编解码器的图像格式,适合对复杂场景和高动态范围(HDR)图像进行有损压缩。对于简单的、低细节的图片(例如纯色或少量渐变图),使用无损压缩可能会导致过多的细节保存,从而生成比源文件更大的文件。

  2. 与原始格式的差异:JPEG 和 PNG 各自有不同的压缩机制。JPEG 是一种有损格式,可能会丢弃细节,因此其文件体积小;PNG 是无损压缩,但它的压缩算法和 AVIF 无损模式不同。AVIF 无损模式会更仔细地保存每一像素的细节,导致有些文件变大。

  3. 压缩算法效率:不同编码参数(例如色彩空间、色深)也会影响文件大小。无损 AVIF 会尝试精确保存色彩信息,这可能会带来比 JPEG 或 PNG 格式更大的数据量。

解决建议

  1. 适当降低质量参数:可以尝试 -q 90-q 80,仍可获得很高的质量,同时减少文件体积。
  2. 选择适合的图片格式:如果目标是无损保存简单图像,PNG 可能更适合;如果需要在保证高质量的前提下减小文件大小,AVIF 有损压缩(如 -q 80)则更合适。
  3. 使用 --min--max 限制量化参数:可以通过 --min QP--max QP 参数来控制 AVIF 的量化范围,从而进一步优化压缩效果。

你可以修改脚本中的 Q_PARAM 设为 80 或 90 试试效果。