图片自动压缩小脚本
本文最后更新于 2024-05-19,
若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益, 请联系我 删除。
本站只有Telegram群组为唯一交流群组, 点击加入
文章内容有误?申请成为本站文章修订者或作者? 向站长提出申请
前言
由于博客的图床图片都是原图上传到服务器自建的本地兰空图床上,偶然被群友吐槽怎么打开速度那么慢,要加载一大堆图片,还特别巨大(1M以上)。于是在建议下写了一个图片自动压缩的脚本,限制博客的图片只有几百K,画质损失也不大。*(由于是压缩完后写的,贴不了网站测试截图)
吐槽一下兰空图床的无效压缩(原图上传只是单纯修改一个后缀名,issues也不修)
我是本地自建的图床,目前脚本只是将兰空图床上传的原图压缩转换成尺寸小的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)
- 首先,确保你的系统上安装了
inotify-tools
,它是用于监视文件系统变化的工具。
sudo apt-get install inotify-tools
- 创建一个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
替换为你的压缩脚本的路径。
- 将这个Shell脚本保存为
watcher.sh
并赋予执行权限。
chmod +x watcher.sh
- 运行
watcher.sh
脚本,它将监视目标文件夹并在有新文件出现时自动调用压缩脚本。
./watcher.sh
这样,每当目标文件夹中新增图片时,压缩脚本将会自动运行以压缩新添加的图片。
由于脚本执行关闭ssh连接会退出。如果你想让它在后台默默地运行,你可以使用 nohup
命令将其挂起,这样即使你关闭了终端,脚本也会继续工作
nohup ./watcher.sh &
这将使 watcher.sh
脚本在后台运行,并且不会受到终端关闭的影响。要停止后台运行的 watcher.sh
脚本,你可以使用 kill
命令将其关闭,如下所示:
ps aux | grep watcher.sh
然后找到其对应的进程ID,然后使用 kill
命令关闭它,比如:
kill PID 771654
这里的 PID
是 watcher.sh
脚本的进程ID。
监视脚本设置为开机启动
具体的步骤可能会因操作系统版本而异。以下是在Ubuntu上设置开机启动的一种方法:
- 创建一个启动脚本,比如
start_watcher.sh
,内容如下:
#!/bin/bash
# 进入到脚本所在目录
cd /path/to/your/script/directory
# 启动监视器脚本
./watcher.sh &
确保将 /path/to/your/script/directory
替换为你的脚本所在的实际路径,并给脚本赋予执行权限:
chmod +x start_watcher.sh
- 编辑
/etc/rc.local
文件:
sudo nano /etc/rc.local
在文件的末尾,添加以下行,指向刚刚创建的启动脚本:
/path/to/start_watcher.sh
确保将 /path/to/start_watcher.sh
替换为你创建的启动脚本的实际路径。
- 保存并关闭
/etc/rc.local
文件。
现在,监视器脚本将会在系统启动时自动运行。