smally是我在Github上尝试的第1个开源小项目。最近花了点时间,将其整体重构,并做了大量简化,正好重新写一篇介绍。
smally项目地址:https://github.com/xinlin-z/smally
smally提供的无损压缩,是通过调用著名的jpegtran
,optipng
和gifsicle
实现的,smally只是提供了一个可以批量处理很多文件的机制。
汲取了一些教训,现在smally的版本,使用file
命令来判别文件类型。
为了简化,遍历目录树的功能也砍掉了,使用强大的find
命令,各种查询条件直接就有了。
图片文件压缩之后,文件名和mtime都保持不变。
JPEG压缩
JPEG图片有baseline和progressive两种格式,smally会尝试比较源文件的这两个格式,选择size小的。如果size一样,选择progressive格式。
PNG压缩
直接使用optipng的最疯狂的-o7 -zm1-9
level压缩,耗时比较长,但能够得到最好的压缩效果。
GIF压缩
直接使用gifsicle的-O3 --colors 256
压缩。
安装工具
Fedora
$ sudo dnf install libjpeg-turbo-utils optipng gifsicle
Ubuntu
$ sudo apt install libjpeg-turbo-progs optipng gifsicle
编译安装
$ sudo bash _install_tools.sh JPEG
$ sudo bash _install_tools.sh PNG
$ sudo bash _install_tools.sh GIF
$ # or all in one command
$ sudo bash _install_tools.sh JPEG PNG GIF
用sudo运行_install_tools.sh脚本,带上参数(如上),可以自动将最新版的jpegtran,optipng和gifsicle,通过编译的方式安装,并将symbolic link设置到/usr/bin下。注意:/usr/bin目录下原来的同名文件将会被删除。
为了安装顺利完成,你可能需要:
$ sudo dnf install gcc make autoconf automake
测试
$ bash test.sh
使用
一般压缩某个文件夹下所有的图片文件:
$ find <path/to/image_folder> -type f -exec bash smally.sh {} ;
也可以分类型:
$ # only jpeg
$ find <path/to/image_folder> -type f -exec bash smally.sh -t JPEG {} ;
$ # only png
$ find <path/to/image_folder> -type f -exec bash smally.sh -t PNG {} ;
$ # only gif
$ find <path/to/image_folder> -type f -exec bash smally.sh -t GIF {} ;
推荐find命令与xargs命令配合,充分利用多核CPU的性能。
下面示例中,-P4
表示同时运行4个进程:
$ find <pathname> -type f -print0 | xargs -0 -P4 -I{} bash smally.sh {}
压缩单个图片:
$ python3 smally.py --jpegtran <jpeg_file>
$ python3 smally.py --optipng <png_file>
$ python3 smally.py --gifsicle <gif_file>
压缩单个你不知道格式的文件:
$ bash smally.sh <filename>
运行截屏
原创文章,作者:中国IPv6网,如若转载,请注明出处:https://www.ipv6s.com/basis/application/202303103179.html