2006年1月20日

Epeg で JPEG ファイルのサムネイルを高速に生成する

Epegは JPEG ファイルのサムネイル (縮小画像) を高速に生成するライブラリです。JPEG に特化した手法でサムネイルの処理を行うため、内部的に画像をビットマップに伸張せず、高速かつ少ないメモリで処理できるのが特徴です。

 

インストール

Epeg は Debian パッケージになっていないようなので、ソース (ダウンロード) からインストールしました Epeg は内部的に libjpeg を使っているため、Debian GNU/Linux では sudo apt-get install libjpeg62-dev で事前にインストールしておく必要があります。

Epeg そのものは ./configure && make && sudo make install でビルド・インストールできます。

サンプルコード

Epeg のサイトにあるコードを少々修正して、画像を縦横ともに 1/4 にするプログラムを書きました。コードは以下の通りです。

#include <Epeg.h>

int
main (int argc, char **argv)
{
    Epeg_Image *image;
    int w, h;
    if (argc < 2) {
        printf("Usage: %s input.jpg output.jpg\n", argv[0]);
        return 1;
    }
    image = epeg_file_open(argv[1]);
    epeg_size_get(image, &w, &h);
    epeg_quality_set(image, 90);
    epeg_decode_size_set(image, w / 4, h / 4);
    epeg_file_output_set(image, argv[2]);
    epeg_encode(image);
    epeg_close(image);
    return 0;
}

コンパイルは次のように行います。

% gcc -O2  -I/usr/local/include -lepeg epeg.c

実験

上で作成したプログラムと ImageMagick の速度を比較してみます。 ここでは実験として 1600x1200の画像 (686kb) を 400x300 に縮小する処理を 100回行うのにかかる時間を測定します。

% time zsh -c "repeat 100 ./a.out lake.jpg epeg.jpg"
7.03s total : 6.67s user 0.31s system 99% cpu
% time zsh -c "repeat 100 convert -resize '25%' lake.jpg 
48.23s total : 43.42s user 4.76s system 99% cpu
% time zsh -c "repeat 100 convert -size 400x300 -resize 400x300 +profile '*' lake.jpg im2.jpg"
8.45s total : 7.25s user 1.22s system 98% cpu

結果は Epeg が 7.03 秒ともっとも速いことがわかりました。また、 top で観察したところ、メモリの使用量がEpeg は約 0.9MBともっとも少ないことがわかりました。

ImageMagick は単に -resize をつけただけだと 48.23 秒かかりますが、 -size オプションによって JPEGデコーダにヒントを与えるとかなり高速化されます。バッドノウハウ的ではありますが…。

処理時間 メモリ使用量
Epeg 7.03秒 約0.9MB
ImageMagick その1 48.23秒 約26MB
ImageMagick その2 8.45秒 約8MB

生成されたサムネイルのファイルのサイズは Epeg 版は 75KB, ImageMagick その 1版その 2版はそれぞれ 90KB になりました。ファイルのサイズは Epeg, ImageMagick ともに品質のパラメータによって大きく変わります。この実験の例では、画質はどれも同等に見えます。

まとめ

Epeg を使うと高速かつ少ないメモリで JPEG ファイルのサムネイルを生成できることがわかりました。JPEG のサムネイルを大量に行う場面で役に立つのではないかと思います。Perl からは Image::Epeg を使うと楽そうです。

ただし、 Epeg は JPEG に特化しているため、入力・出力ともに JPEG 以外を扱えないという制限があります。あやふやな記憶になりますが、JPEG, PNG のどちらを扱う場合でも、Imlib2 (ダウンロード) は ImageMagick より速かったと思います。