Smally is a simple tool to compress JPEG, PNG and GIF files losslessly,
by invoking the famous jpegtran
, optipng
and gifsicle
tools,
in batch mode, in-place and keep mtime unchanged. It is written
in Python, but heavily rely on shell.
- Using
jpegtran
to remove all metadata, create a baseline version and a progressive version. - To compare among the original file, baseline and progressive files, choose the smallest one in size.
- Whenever possible, choose progressive version.
Calling optipng
to compress PNG, in the most crazy -o7 -zm1-9
level.
Calling gifsicle
to compress GIF, by using -O3 --color 256
.
# install tools on Fedora
$ sudo dnf install libjpeg-turbo-utils optipng gifsicle
# install tools on Ubuntu
$ sudo apt install libjpeg-turbo-progs optipng gifsicle
# install smally
$ pip install smally
# inline help
$ python -m smally -h
# to compress a single file, if option is not presented,
# smally will use file command to get file type info.
$ python -m smally [-j|-p|-g] <pathname>
# to compress a directory
$ python -m smally -r -P<N> <pathname>
# to compress all png file in a directory
$ python -m smally -r -P<N> -p <pathname>
-r
, recursively, it's a command line convention and normally you should
use it when deal with a directory.
-P<N>
, parallel process number, if it is missing, the logical cpu
count number will be used.
4 APIs provided by smally:
# import
from smally import (jpegtran,
optipng,
gifsicle,
is_jpeg_progressive)
# signature
def jpegtran(pathname: str) -> tuple[int,int]: ...
def optipng(pathname: str) -> tuple[int,int]: ...
def gifsicle(pathname: str) -> tuple[int,int]: ...
def is_jpeg_progressive(pathname: str) -> bool: ...
The first int in returned tuple is the byte number saved. It could be zero, which means no save. The second int is the original file size.
$ python -m smally -r smally/tpic -P4
# parallel process number: 4
smally/tpic/102.jpg -24157 -16.38% [p]
smally/tpic/302.gif -333056 -19.67%
smally/tpic/testpic/302.gif -333056 -19.67%
smally/tpic/testpic/102.jpg -24157 -16.38% [p]
smally/tpic/201.png -548 -26.37%
smally/tpic/testpic/201.png -548 -26.37%
smally/tpic/testpic/testpic/102.jpg -24157 -16.38% [p]
smally/tpic/testpic/testpic/302.gif -333056 -19.67%
smally/tpic/testpic/testpic/201.png -548 -26.37%