本文最后更新于 2024-05-19,

若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益, 请联系我 删除。

本站只有Telegram群组为唯一交流群组, 点击加入

文章内容有误?申请成为本站文章修订者或作者? 向站长提出申请

前言

由于博客的图床图片都是原图上传到服务器自建的本地兰空图床上,偶然被群友吐槽怎么打开速度那么慢,要加载一大堆图片,还特别巨大(1M以上)。于是在建议下写了一个图片自动压缩的脚本,限制博客的图片只有几百K,画质损失也不大。*(由于是压缩完后写的,贴不了网站测试截图)

吐槽一下兰空图床的无效压缩(原图上传只是单纯修改一个后缀名,issues也不修)

1716127318252.webp

我是本地自建的图床,目前脚本只是将兰空图床上传的原图压缩转换成尺寸小的webp。我建议使用兰空图床的用户可以按照我图中设置改成webp,虽然上传是无效的,但是不用修改脚本的格式内容。

功能

  • 遍历指定目录下的所有文件夹和文件,筛选出其中的webp图片,并将它们压缩为指定质量的webp格式(如果你要压缩其他图片,请在脚本中增加图片格式,如:jpg/png)
  • 直接替换文件夹内的原有图片。以避免造成数据库冲突
  • 当新增图片时自动触发脚本进行压缩
  • 添加异常处理,跳过图像文件损坏或者格式不正确导致的脚本中断

脚本使用Python中的Pillow库来处理图片。首先,确保你已经安装了Pillow库:

pip install pillow

然后,可以使用以下Python脚本:

from PIL import Image
import os

def compress_webp_in_folder(folder_path, quality=80):
    # 读取已经压缩过的文件列表
    compressed_files = set()
    compressed_files_path = 'compressed_files.txt'
    if os.path.exists(compressed_files_path):
        with open(compressed_files_path, 'r') as file:
            compressed_files = set(file.read().splitlines())

    # 获取当前文件夹中所有文件和子文件夹
    for root, dirs, files in os.walk(folder_path):
        # 遍历当前文件夹中的文件
        for file in files:
            file_path = os.path.join(root, file)
            # 检查文件是否为webp格式且是否已经压缩过
            if file.lower().endswith('.webp') and file_path not in compressed_files:
                try:
                    # 打开图片并保存为webp格式,覆盖原始文件,指定压缩质量
                    with Image.open(file_path) as img:
                        img.save(file_path, 'webp', quality=quality)
                    # 记录已经压缩过的文件
                    compressed_files.add(file_path)
                except Exception as e:
                    print(f"Error compressing {file_path}: {e}")

    # 将已经压缩过的文件列表写入文件
    with open(compressed_files_path, 'w') as file:
        file.write('\n'.join(compressed_files))

if __name__ == "__main__":
    folder_path = '/path/to/your/folder'  # 替换为你要遍历的文件夹路径
    quality = 70  # 压缩质量,可根据需要调整
  
    compress_webp_in_folder(folder_path, quality)

/path/to/your/folder替换为你要遍历的文件夹路径

在这个脚本中,quality参数表示压缩质量。对于使用 Pillow库保存为 webp格式的图片,quality参数控制压缩的质量水平,取值范围为0到100,其中0表示最低质量,100表示最高质量。质量越高,图像的细节保留得越好,但文件大小也会相应增加。通常,你可以根据实际需求调整质量参数,找到最适合你应用场景的平衡点。(个人建议60)

监控新增图片以及脚本开机自启动

使用inotify-tools(Linux)

  1. 首先,确保你的系统上安装了 inotify-tools,它是用于监视文件系统变化的工具。
sudo apt-get install inotify-tools
  1. 创建一个Shell脚本,该脚本监视目标文件夹的变化并在新文件出现时调用压缩脚本。
#!/bin/bash

# 被监视的目标文件夹
WATCH_DIR="/path/to/your/folder"

# 监视文件夹变化,并调用压缩脚本
inotifywait -m -r -e create --format "%w%f" "$WATCH_DIR" | while read NEW_FILE
do
    # 调用压缩脚本
    python /path/to/compress_script.py
done

请将 /path/to/your/folder替换为要监视的目标文件夹的路径,并将 /path/to/compress_script.py替换为你的压缩脚本的路径。

  1. 将这个Shell脚本保存为 watcher.sh并赋予执行权限。
chmod +x watcher.sh
  1. 运行 watcher.sh脚本,它将监视目标文件夹并在有新文件出现时自动调用压缩脚本。
./watcher.sh

这样,每当目标文件夹中新增图片时,压缩脚本将会自动运行以压缩新添加的图片。

由于脚本执行关闭ssh连接会退出。如果你想让它在后台默默地运行,你可以使用 nohup命令将其挂起,这样即使你关闭了终端,脚本也会继续工作

nohup ./watcher.sh &

这将使 watcher.sh脚本在后台运行,并且不会受到终端关闭的影响。要停止后台运行的 watcher.sh脚本,你可以使用 kill命令将其关闭,如下所示:

ps aux | grep watcher.sh

然后找到其对应的进程ID,然后使用 kill命令关闭它,比如:

kill PID 771654

这里的 PIDwatcher.sh脚本的进程ID。

监视脚本设置为开机启动

具体的步骤可能会因操作系统版本而异。以下是在Ubuntu上设置开机启动的一种方法:

  1. 创建一个启动脚本,比如 start_watcher.sh,内容如下:
#!/bin/bash

# 进入到脚本所在目录
cd /path/to/your/script/directory

# 启动监视器脚本
./watcher.sh &

确保将 /path/to/your/script/directory替换为你的脚本所在的实际路径,并给脚本赋予执行权限:

chmod +x start_watcher.sh
  1. 编辑 /etc/rc.local文件:
sudo nano /etc/rc.local

在文件的末尾,添加以下行,指向刚刚创建的启动脚本:

/path/to/start_watcher.sh

确保将 /path/to/start_watcher.sh替换为你创建的启动脚本的实际路径。

  1. 保存并关闭 /etc/rc.local文件。

现在,监视器脚本将会在系统启动时自动运行。