2014年9月6日土曜日

pngのロスレス圧縮を行う

Google先生のPageSpeed Insightsに引き続き、次のようにお怒りを頂いています(´;ω;`)ブワッ

画像を適切にフォーマット化して圧縮すると、
データ サイズを大きく削減できます。ロスレス圧縮してください( ‘д‘⊂彡☆))Д´) パーン

とのことでした(´;ω;`)ウッ…

ロスレス圧縮とは? lossless圧縮
lossless圧縮とは、データを全く損なわずに復元できるような圧縮方式のことである。
データを再び元の状態に戻せるところから、可逆圧縮とも呼ばれる。
テキストデータやプログラムのソースコードなどは、データがひとつでも変わると内容もはっきりと変わってくる。

(´・∀・`)ヘー

centosでロスレス圧縮を行うにはoptipngが必要のようなので、インストールの方を行います( ´∀`)bグッ!

ダウンロードします。
wget http://prdownloads.sourceforge.net/optipng/optipng-0.7.5.tar.gz?download
解凍します。
tar xzf optipng-0.7.5.tar.gz
解凍先のディレクトリへ移動する
cd optipng-0.7.5
stowを使ってインストールするためprefixを指定します。
sudo ./configure --prefix=/usr/local/stow/optipng-0.7.5
Checking for gcc...
Using pre-configured libpng...
Configuring zlib...
Checking for gcc...
Building static library libz.a version 1.2.8-optipng with gcc.
Checking for off64_t... Yes.
Checking for fseeko... Yes.
Checking for strerror... Yes.
Checking for unistd.h... Yes.
Checking for stdarg.h... Yes.
Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf().
Checking for vsnprintf() in stdio.h... Yes.
Checking for return value of vsnprintf()... Yes.
Checking for attribute(visibility) support... Yes.
makeを行います。
sudo make
cd src/optipng && \
        make && \
        cd ../..
make[1]: ディレクトリ `/home/admin/optipng-0.7.5/src/optipng' に入ります
cd ../zlib && \
        make -f Makefile && \
        cd ../optipng
make[2]: ディレクトリ `/home/admin/optipng-0.7.5/src/zlib' に入ります
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -I. -c -o example.o test/example.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o adler32.o adler32.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o crc32.o crc32.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o deflate.o deflate.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o infback.o infback.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o inffast.o inffast.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o inflate.o inflate.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o inftrees.o inftrees.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o trees.o trees.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o zutil.o zutil.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o compress.o compress.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o uncompr.o uncompr.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o gzclose.o gzclose.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o gzlib.o gzlib.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o gzread.o gzread.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o gzwrite.o gzwrite.c
ar rc libz.a adler32.o crc32.o deflate.o infback.o inffast.o inflate.o inftrees.o trees.o zutil.o compress.o uncompr.o gzclose.o gzlib.o gzread.o gzwrite.o
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -o example example.o -L. libz.a
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -I. -c -o minigzip.o test/minigzip.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -o minigzip minigzip.o -L. libz.a
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -I. -D_FILE_OFFSET_BITS=64 -c -o example64.o test/example.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -o example64 example64.o -L. libz.a
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -I. -D_FILE_OFFSET_BITS=64 -c -o minigzip64.o test/minigzip.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -o minigzip64 minigzip64.o -L. libz.a
make[2]: ディレクトリ `/home/admin/optipng-0.7.5/src/zlib' から出ます
cd ../libpng && \
        make -f Makefile PNGLIBCONF_H_PREBUILT=pnglibconf.h.optipng && \
        cd ../optipng
make[2]: ディレクトリ `/home/admin/optipng-0.7.5/src/libpng' に入ります
cp pnglibconf.h.optipng pnglibconf.h
gcc -c -I../zlib  -O2 -Wall -Wextra -o png.o png.c
gcc -c -I../zlib  -O2 -Wall -Wextra -o pngerror.o pngerror.c
gcc -c -I../zlib  -O2 -Wall -Wextra -o pngget.o pngget.c
gcc -c -I../zlib  -O2 -Wall -Wextra -o pngmem.o pngmem.c
gcc -c -I../zlib  -O2 -Wall -Wextra -o pngpread.o pngpread.c
gcc -c -I../zlib  -O2 -Wall -Wextra -o pngread.o pngread.c
gcc -c -I../zlib  -O2 -Wall -Wextra -o pngrio.o pngrio.c
gcc -c -I../zlib  -O2 -Wall -Wextra -o pngrtran.o pngrtran.c
pngrtran.c:97: 警告: ‘png_rtran_ok’ defined but not used
gcc -c -I../zlib  -O2 -Wall -Wextra -o pngrutil.o pngrutil.c
gcc -c -I../zlib  -O2 -Wall -Wextra -o pngset.o pngset.c
gcc -c -I../zlib  -O2 -Wall -Wextra -o pngtrans.o pngtrans.c
gcc -c -I../zlib  -O2 -Wall -Wextra -o pngwio.o pngwio.c
gcc -c -I../zlib  -O2 -Wall -Wextra -o pngwrite.o pngwrite.c
gcc -c -I../zlib  -O2 -Wall -Wextra -o pngwtran.o pngwtran.c
gcc -c -I../zlib  -O2 -Wall -Wextra -o pngwutil.o pngwutil.c
ar rcs libpng.a png.o pngerror.o pngget.o pngmem.o pngpread.o pngread.o pngrio.o pngrtran.o pngrutil.o pngset.o pngtrans.o pngwio.o pngwrite.o pngwtran.o pngwutil.o
ranlib libpng.a
gcc -c -I../zlib  -O2 -Wall -Wextra -o pngtest.o pngtest.c
gcc  -L../zlib -o pngtest pngtest.o libpng.a -lz -lm
make[2]: ディレクトリ `/home/admin/optipng-0.7.5/src/libpng' から出ます
cd ../opngreduc && \
        make -f Makefile libopngreduc.a && \
        cd ../optipng
make[2]: ディレクトリ `/home/admin/optipng-0.7.5/src/opngreduc' に入ります
gcc -c  -O2 -Wall -Wextra -I../zlib -I../libpng -o opngreduc.o opngreduc.c
ar cru libopngreduc.a opngreduc.o
ranlib libopngreduc.a
make[2]: ディレクトリ `/home/admin/optipng-0.7.5/src/opngreduc' から出ます
cd ../gifread && \
        make -f Makefile libgifread.a && \
        cd ../optipng
make[2]: ディレクトリ `/home/admin/optipng-0.7.5/src/gifread' に入ります
gcc -c  -O2 -Wall -Wextra -o gifread.o gifread.c
ar cru libgifread.a gifread.o
ranlib libgifread.a
make[2]: ディレクトリ `/home/admin/optipng-0.7.5/src/gifread' から出ます
cd ../pnmio && \
        make -f Makefile libpnmio.a && \
        cd ../optipng
make[2]: ディレクトリ `/home/admin/optipng-0.7.5/src/pnmio' に入ります
gcc -c  -O2 -Wall -Wextra -o pnmin.o pnmin.c
gcc -c  -O2 -Wall -Wextra -o pnmout.o pnmout.c
gcc -c  -O2 -Wall -Wextra -o pnmutil.o pnmutil.c
ar cru libpnmio.a pnmin.o pnmout.o pnmutil.o
ranlib libpnmio.a
make[2]: ディレクトリ `/home/admin/optipng-0.7.5/src/pnmio' から出ます
cd ../minitiff && \
        make -f Makefile libminitiff.a && \
        cd ../optipng
make[2]: ディレクトリ `/home/admin/optipng-0.7.5/src/minitiff' に入ります
gcc -c  -O2 -Wall -Wextra -o tiffbase.o tiffbase.c
gcc -c  -O2 -Wall -Wextra -o tiffread.o tiffread.c
ar cru libminitiff.a tiffbase.o tiffread.o
ranlib libminitiff.a
make[2]: ディレクトリ `/home/admin/optipng-0.7.5/src/minitiff' から出ます
cd ../pngxtern && \
        make -f Makefile libpngxtern.a && \
        cd ../optipng
make[2]: ディレクトリ `/home/admin/optipng-0.7.5/src/pngxtern' に入ります
gcc -c  -O2 -Wall -Wextra -I../zlib -I../libpng -I../gifread -I../pnmio -I../minitiff -o pngxread.o pngxread.c
gcc -c  -O2 -Wall -Wextra -I../zlib -I../libpng -I../gifread -I../pnmio -I../minitiff -o pngxrbmp.o pngxrbmp.c
gcc -c  -O2 -Wall -Wextra -I../zlib -I../libpng -I../gifread -I../pnmio -I../minitiff -o pngxrgif.o pngxrgif.c
gcc -c  -O2 -Wall -Wextra -I../zlib -I../libpng -I../gifread -I../pnmio -I../minitiff -o pngxrjpg.o pngxrjpg.c
gcc -c  -O2 -Wall -Wextra -I../zlib -I../libpng -I../gifread -I../pnmio -I../minitiff -o pngxrpnm.o pngxrpnm.c
gcc -c  -O2 -Wall -Wextra -I../zlib -I../libpng -I../gifread -I../pnmio -I../minitiff -o pngxrtif.o pngxrtif.c
gcc -c  -O2 -Wall -Wextra -I../zlib -I../libpng -I../gifread -I../pnmio -I../minitiff -o pngxio.o pngxio.c
gcc -c  -O2 -Wall -Wextra -I../zlib -I../libpng -I../gifread -I../pnmio -I../minitiff -o pngxmem.o pngxmem.c
pngxmem.c: In function ‘pngx_malloc_rows_extended’:
pngxmem.c:37: 警告: データ型の範囲制限によって、比較が常に false となります
gcc -c  -O2 -Wall -Wextra -I../zlib -I../libpng -I../gifread -I../pnmio -I../minitiff -o pngxset.o pngxset.c
ar cru libpngxtern.a pngxread.o pngxrbmp.o pngxrgif.o pngxrjpg.o pngxrpnm.o pngxrtif.o pngxio.o pngxmem.o pngxset.o
ranlib libpngxtern.a
make[2]: ディレクトリ `/home/admin/optipng-0.7.5/src/pngxtern' から出ます
gcc -c  -O2 -Wall -Wextra -I../cexcept -I../zlib -I../libpng -I../opngreduc -I../pngxtern -o optipng.o optipng.c
gcc -c  -O2 -Wall -Wextra -I../cexcept -I../zlib -I../libpng -I../opngreduc -I../pngxtern -o optim.o optim.c
gcc -c  -O2 -Wall -Wextra -I../cexcept -I../zlib -I../libpng -I../opngreduc -I../pngxtern -o bitset.o bitset.c
gcc -c  -O2 -Wall -Wextra -I../cexcept -I../zlib -I../libpng -I../opngreduc -I../pngxtern -o ratio.o ratio.c
gcc -c  -O2 -Wall -Wextra -I../cexcept -I../zlib -I../libpng -I../opngreduc -I../pngxtern -o osys.o osys.c
gcc -c  -O2 -Wall -Wextra -I../cexcept -I../zlib -I../libpng -I../opngreduc -I../pngxtern -o wildargs.o wildargs.c
gcc -s -o optipng optipng.o optim.o bitset.o ratio.o osys.o wildargs.o ../opngreduc/libopngreduc.a ../pngxtern/libpngxtern.a ../libpng/libpng.a ../zlib/libz.a ../gifread/libgifread.a ../pnmio/libpnmio.a ../minitiff/libminitiff.a   -lm
make[1]: ディレクトリ `/home/admin/optipng-0.7.5/src/optipng' から出ます
インストールを行います。
sudo make install
cd src/optipng && \
        make install && \
        cd ../..
make[1]: ディレクトリ `/home/admin/optipng-0.7.5/src/optipng' に入ります
mkdir -p /usr/local/stow/optipng-0.7.5/bin
mkdir -p /usr/local/stow/optipng-0.7.5/man/man1
cp -f -p optipng /usr/local/stow/optipng-0.7.5/bin
cp -f -p man/optipng.1 /usr/local/stow/optipng-0.7.5/man/man1
make[1]: ディレクトリ `/home/admin/optipng-0.7.5/src/optipng' から出ます
prefixで指定したstowのディレクトリへ移動します。
cd /usr/local/stow
stowで関連付けを行います。
sudo stow -v optipng-0.7.5
インストールされたバージョンの確認します。
optipng -v
OptiPNG version 0.7.5
Copyright (C) 2001-2014 Cosmin Truta and the Contributing Authors.

This program is open-source software. See LICENSE for more details.

Portions of this software are based in part on the work of:
  Jean-loup Gailly and Mark Adler (zlib)
  Glenn Randers-Pehrson and the PNG Development Group (libpng)
  Miyasaka Masaru (BMP support)
  David Koblas (GIF support)

Using libpng version 1.6.10-optipng and zlib version 1.2.8-optipng
これで、インストールは完了( ´∀`)bグッ!

オプションの確認φ(゚Д゚ )フムフム…
optipng -h
Synopsis:
    optipng [options] files ...
Files:
    Image files of type: PNG, BMP, GIF, PNM or TIFF
Basic options:
    -?, -h, -help       show this help
    -o <level>          optimization level (0-7)                [default: 2]
    -v                  run in verbose mode / show copyright and version info
General options:
    -backup, -keep      keep a backup of the modified files
    -clobber            overwrite existing files
    -fix                enable error recovery
    -force              enforce writing of a new output file
    -preserve           preserve file attributes if possible
    -quiet, -silent     run in quiet mode
    -simulate           run in simulation mode
    -out <file>         write output file to <file>
    -dir <directory>    write output file(s) to <directory>
    -log <file>         log messages to <file>
    --                  stop option switch parsing
Optimization options:
    -f <filters>        PNG delta filters (0-5)                 [default: 0,5]
    -i <type>           PNG interlace type (0-1)
    -zc <levels>        zlib compression levels (1-9)           [default: 9]
    -zm <levels>        zlib memory levels (1-9)                [default: 8]
    -zs <strategies>    zlib compression strategies (0-3)       [default: 0-3]
    -zw <size>          zlib window size (256,512,1k,2k,4k,8k,16k,32k)
    -full               produce a full report on IDAT (might reduce speed)
    -nb                 no bit depth reduction
    -nc                 no color type reduction
    -np                 no palette reduction
    -nx                 no reductions
    -nz                 no IDAT recoding
Editing options:
    -snip               cut one image out of multi-image or animation files
    -strip <objects>    strip metadata objects (e.g. "all")
Optimization levels:
    -o0         <=>     -o1 -nx -nz                             (0 or 1 trials)
    -o1         <=>     -zc9 -zm8 -zs0 -f0                      (1 trial)
                (or...) -zc9 -zm8 -zs1 -f5                      (1 trial)
    -o2         <=>     -zc9 -zm8 -zs0-3 -f0,5                  (8 trials)
    -o3         <=>     -zc9 -zm8-9 -zs0-3 -f0,5                (16 trials)
    -o4         <=>     -zc9 -zm8 -zs0-3 -f0-5                  (24 trials)
    -o5         <=>     -zc9 -zm8-9 -zs0-3 -f0-5                (48 trials)
    -o6         <=>     -zc1-9 -zm8 -zs0-3 -f0-5                (120 trials)
    -o7         <=>     -zc1-9 -zm8-9 -zs0-3 -f0-5              (240 trials)
    -o7 -zm1-9  <=>     -zc1-9 -zm1-9 -zs0-3 -f0-5              (1080 trials)
Notes:
    The combination for -o1 is chosen heuristically.
    Exhaustive combinations such as "-o7 -zm1-9" are not generally recommended.
Examples:
    optipng file.png                                            (default speed)
    optipng -o5 file.png                                        (slow)
    optipng -o7 file.png                                        (very slow)
圧縮対象のファイルはPNG, BMP, GIF, PNM or TIFF形式みたいです(´・∀・`)ヘー

optipngの使い方は次のような感じです。

圧縮せずにシミレーションを行う。
optipng -simulate /tmp/exit.png
圧縮率を指定する。o1からo7段階で設定が出来る。(デフォルトはo2で、最高圧縮はo7)
optipng -simulate -o7 /tmp/exit.png
バックアップを作成して圧縮を行う
optipng -backup -o7 /tmp/exit.png
** Processing: /tmp/exit.png
224x54 pixels, 4x8 bits/pixel, RGB+alpha, interlaced
Reducing image to 8 bits/pixel, 191 colors (83 transparent) in palette
Stripping metadata...
Input IDAT size = 7328 bytes
Input file size = 7422 bytes

Trying:
  zc = 9  zm = 9  zs = 0  f = 0         IDAT size = 3965
  zc = 9  zm = 8  zs = 0  f = 0         IDAT size = 3965

Selecting parameters:
  zc = 9  zm = 8  zs = 0  f = 0         IDAT size = 3965

Output IDAT size = 3965 bytes (3363 bytes decrease)
Output file size = 4702 bytes (2720 bytes = 36.65% decrease)
36%ほど圧縮されるっぽいですъ(゚Д゚)グッジョブ!!

メタ情報を削除した方がサイズが小さくなるので、
必ず-strip allオプションをつけた方が良いかもです( ´∀`)bグッ!
optipng -backup -o7 -strip all /tmp/exit.png
指定したディレクトリにあるpng画像全てを圧縮する場合には、次のようなコマンドで一括で変更できます。 (バックアップがいらない場合には-backupをはずすこと)
find /tmp/ -name "*.png" -print | xargs optipng -backup -o7 -strip all


念のため作業ディレクトリを作ってそちらで作業する場合(gif版)
mdir -p /tmp/gif
ディレクトリ構造を一時して指定されたファイルのみコピーする
find /tmp/original -name "*.gif" -print0 | xargs -0 cp --parents -t /tmp/gif/
xargsを使うとエラーが出てしまっていた・・・orz
find /tmp/gif -name "*.gif" | xargs optipng -o7 -strip all -out {} {} > /tmp/lossres.log 2>&1
** Error: The option -out requires one input file
execを利用する
find /tmp/gif -name "*.gif" -exec optipng -o7 -strip all -out {} {} \; > /tmp/lossres.log 2>&1

以上です(`・ω・´)ゞビシッ!!

参考URL

0 件のコメント:

コメントを投稿