画像ファイルのサイズ縮小

JPEGPNGの内容を変更させずにサイズの縮小を試みてみた。

JPEGに関しては"jpegtran"でハフマン符号の最適化を試みる。PNGに関しては"optipng"でPNGのパラメータをほぼ総当りで試した後、zopflipngでIDATエントリの中身を再圧縮する。

こんな感じ

#!/bin/bash
IN=$1
EXT=${IN##*.}
case "${EXT}" in
        [Jj][Pp][Gg] | [Jj][Pp][Ee][Gg] )
                if [ ! -f "${IN%.opt.jpg}.opt.jpg" ]; then
                        echo "${IN}"
                        jpegtran -copy all -optimize -progressive -outfile "${IN%.*}.opt.jpg" "${IN}"
                        rm "${IN}"
                fi;;
        [Pp][Nn][Gg] )
                if [ ! -f "${IN%.opt.png}.opt.png" ]; then
                        echo "${IN}"
                        unset tmpfile
                        trap "[[ $tmpfile ]] && rm -f $tmpfile" 1 2 3 15
                        tmpfile=$(mktemp)
                        optipng -quiet -fix -preserve -out ${tmpfile} -o 6 -i 0 "${IN}"
                        zopflipng -m ${tmpfile} "${IN%.*}.opt.png"
                        rm "${IN}" ${tmpfile}
                fi;;
esac

とりあえずCPU負荷すごい。PNGの圧縮パラメータ複雑すぎ。