初衷

最近倒腾了Notion2markdown写作,上传了很多高清大图,但没想到 CDN 流量账单一路狂飙。。。

遂出此策,将封面图统一调小,另将图床上的图片批量压缩后重新上传,减少流量消耗(穷)。

实现步骤

对 Notion 上传的封面图片:

  • 统一用PowerToys提供的Image Resizer进行尺寸压缩,压缩到800×600px进行替换

对于图床上的既有图片:

  • 从图床批量打包下载原图
  • Linux系统下(博主采用的WSL2/Ubuntu 22.04 TLS),使用compress.sh进行图片批量压缩,采用的图片质量为50%,可自定义
  • 重新上传到图床,覆盖原文件
  • 原图打包丢网盘保存,备用

重新配置图床CDN图片浏览器缓存时间,增加到 30 天,开启防盗链。

下面重点介绍压缩过程。

批量压缩

主要介绍采用compress.sh脚本进行批量压缩的过程,其采用ImageMagick命令对图片进行压缩。

compress.sh脚本已共享,见源码

执行方法如下:

1
./compress.sh <source_path> <output_path> [quality]

参数说明:

  • source_path 原图目录
  • output_path 压缩后图片保存位置
  • quality 压缩后的图片质量百分比,默认80%

以下是将source文件夹下所有图片质量压缩到50%,并输出到compressed的命令行案例:

1
./compress.sh ./backups ./output 50

效果

本地

压缩前约830M,压缩后280M,减少66%(选用的图片质量为50%,供参考)

COS 腾讯云

直接减半,减少钱包烦恼

compress.sh

所撰写的核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/bin/bash
###
# @Author: Dorad, ddxi@qq.com
# @Date: 2023-04-22 00:04:43 +02:00
# @LastEditors: Dorad, ddxi@qq.com
# @LastEditTime: 2023-04-22 00:18:13 +02:00
# @FilePath: \compress.sh
# @Description:
#
# Copyright (c) 2023 by Dorad (ddxi@qq.com), All Rights Reserved.
###

# 输入文件夹路径和输出文件夹路径

# 获取输入参数
if [ $# -lt 2 ]; then
echo "Usage: $0 input_dir output_dir <quality%>"
exit 1
fi

if [ ! -d "$1" ]; then
echo "Input dir $1 not exists"
exit 1
fi

input_dir=$1
output_dir=$2
# 压缩后的图片质量百分比, 默认为 80
if [ -z "$3" ]; then
quality=80
else
quality=$3
fi

# 检查convert命令是否存在
if ! command -v convert &>/dev/null; then
echo "convert command not found, please install ImageMagick first"
exit 1
fi

# 遍历输入文件夹下所有图片文件
find $input_dir -type f -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.gif' | while read file; do
# 创建输出文件夹的相同目录结构
relative_path=${file#"$input_dir"}
output_file="$output_dir/$relative_path"
echo "Output file: $output_file"
# 创建输出文件夹
mkdir -p "${output_file%/*}"
# 压缩图片并输出到相应的文件夹下
convert "$file" -quality $quality "$output_file"
echo "Compress $file, output to $output_dir/$file"
done

echo "Total files: $(find $input_dir -type f -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.gif' | wc -l)"
echo "Compressed files: $(find $output_dir -type f -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.gif' | wc -l)"
echo "Done!"

源码直达

参考