« 演奏会案内:2008年2月分 | トップページ | ディスコグラフィ作成:同義語辞書の作成 »

ディスコグラフィ作成:CDジャケット画像の縮小とWebサーバへのデータ転送

700枚余りのCDのデータ入力とジャケット写真をスキャナでJPEG画像として取り込む作業は終わり、その後買い足したCDについても、買った当日にデータ入力とジャケット取り込みをするように習慣付けるようになったので、データ入力に関しては問題はクリアできた。

しかし、CDデータを収めたUTF8形式のタブ区切りテキストファイル3つと、CD枚数と同じだけのJPEGファイル700個をFTPクライアントソフトを使ってWebサーバへ転送するのがかなり面倒・・・。
FTPクライアントソフトを使って、転送したいファイルをいちいち選択して転送するという作業自体が面倒だし、転送漏れも起こりうる。これは、データ入力ツールにFTP転送の機能も追加したほうがよさそう。これは、MFCのインターネットクラスなどを使うことで1日でサクッと作れてしまうのだった。

それともう一つ。携帯からも検索できるようにしようと考えているのでジャケットの画像ファイルのサイズを小さくしたものも用意しておきたい、という要求も出てきた。データ入力の際、スキャナからは100dpiで取り込んでいるため、大体480×480ピクセル、80~100kバイト程度のJPEGファイルが700個ある。携帯の画面サイズは(少なくとも私の持っている東芝のau向け機種では)240×320ピクセルなので最大でも200×200ピクセル程度まで画像を縮小する必要があるし、ファイルサイズも小さくないとパケット通信料も馬鹿にならない。とにかくJPEG画像を縮小したい。

最初は、オリジナルの480×480ピクセル、100kバイトのファイルをCGIで動的に縮小することを考えていたので、PerlでJPEGファイルのリサイズできるものはないかと検索してみたが、なかなか見つからない。まあ、JPEGファイルの仕様自体が、離散コサイン変換とか圧縮と言った数学的内容を含んでいて難解なので、簡単にPerlベースのソースコードを見つけようというのも無理があるわけだが・・・。

そんなわけで、CGIで動的に画像を縮小することはあきらめ、PC上で画像を縮小するためのツールやライブラリをVectorで検索してみたが、どうも見つからない。
で、いろいろ検索するうちに、ImageMagickというオープンソースのライブラリがあるらしい、ということを知り、ImageMagickの公式サイトからWindows用のインストールパッケージ(WindowsInstaller形式ファイル)をダウンロードして、インストールし、公式サイトのチュートリアルページを参考に、
「JPEGファイルを読み込み、元の1/4に縮小し、JPEGファイルとして書き出す」
というコードを書いてみたが、ファイルを読み込むところで落ちてしまう。インストールされていたサンプルコードと見比べても何が違うのか良く分からない。

仕方ないのでライブラリの全ソースを圧縮したzipファイルを公式サイトからダウンロードして展開し、ライブラリをビルド・・・してみたが、コンパイルエラーが出まくってどうしようもない。結局、インクルードファイルの中のマクロ定義を2つコメントアウトしたらビルド成功。コメントアウトしたマクロ定義は、XWindowを使うかどうかを決定するマクロと、GNOMEのxmlライブラリを使うかどうかを決定するマクロだった。ソースをダウンロードしてからビルドに成功するまで丸1日・・・。今使っているノートPCはいろんなソフトをインストールしまくっているせいかビルドがやたら遅いので、セーフモードで起動した状態でビルドする、という有様(笑)。それでもデバッグモードでのビルドに要した時間は1時間弱。今のPC、今度の3月で4年になるし、そろそろ新しいPCに乗り換える時期にきたかも。
ライブラリをデバッグモードでビルドするのに1日かかったあと、ようやくデバッグ再開。ライブラリの奥底までステップインしてようやく分かったのは、環境変数MAGICK_CODER_FILTER_PATHとMAGICK_CODER_MODULE_PATHを定義しておかなければいけない、ということだけだった。

まあ、そんなドタバタはあったものの、ImageMagickライブラリ(より厳密には、ImageMagickにアクセスするためのC++インタフェースクラスライブラリ)を使うと、非常に簡単にJPEGファイルの縮小ができた。以下にサンプルコードを示す。

#include <Magick++.h>      //このファイル1つをインクルードすればライブラリの全機能が使用可能
using namespace Magick;

int main( int argc, char **argv )
{
   InitializeMagick(*argv);   //exeファイル名を引数としてライブラリを初期化

   try{
    Image xImage;   //画像データを保持するオブジェクト

    //jpeg画像を読み込む
    xImage.read( "sample.jpg" );

    //元画像の25%に縮小
    unsigned int uWidth = xImage.columns(), uHeight = xImage.rows();  //画像の幅と高さを取得
    Geometry xGeometry( uWidth/4, uHeight/4 );  //サイズを定義するクラス
    xImage.resize( xGeometry );

    //jpeg画像を保存する
    xImage.write( "sample_small.jpg" );
   }
   catch ( Error& rxError ) {
    std::cout << rxError.what() <<std::endl; //エラーの内容を表示
   }
}

このImageMagickライブラリ、画像ファイルの読み書きとサイズ変更だけではなく、さまざまな機能を持っているらしいので、画像を扱うアプリを書く機会があれば勉強してみたいと思う。そんなことはさておき、同義語辞書を作成するためのGUIをまだ全然考えていない。うーん・・・。

|

« 演奏会案内:2008年2月分 | トップページ | ディスコグラフィ作成:同義語辞書の作成 »

C/C++」カテゴリの記事

パソコン・インターネット」カテゴリの記事

プログラミング」カテゴリの記事

コメント

ぢつは私も半年ほど前に「画像の加工を自動化するのに使える、出来合いのツール知らない?」と上司に話を振られて調べた時に、やはりImageMagickに行き当たりました(笑)。
Pelleasさんのお使いのサーバ、コマンドライン版のImageMagickは入っていませんでした?
あれば、画像の拡大縮小切り抜きなど、簡単なシェルスクリプトでサクッと出来たりします。

この辺とか、良かったらご参考までに・・・って、既にもうご覧になっている可能性は大ですが:
http://mechanics.civil.tohoku.ac.jp/soft/node43.html

ただ、コイツはLinuxのディストリビューションに良く入っているのですが、そういうパッケージの中でもセキュリティパッチの更新頻度が特に高いので、「元々の出来は大丈夫なのか?」って思う時があります。

投稿: D | 2008/01/12 02:11

DさんもImageMagickに行き当たっておられましたか。
私の使っているサーバには、ImageMagickのコマンドラインツールは入ってなかったのですが、PerlからImageMagickが使えることが判明したので、縮小画像を出力するCGIスクリプトを10分で作ってしまいました。

投稿: Pelleas | 2008/01/12 15:23

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/225253/17659326

この記事へのトラックバック一覧です: ディスコグラフィ作成:CDジャケット画像の縮小とWebサーバへのデータ転送:

« 演奏会案内:2008年2月分 | トップページ | ディスコグラフィ作成:同義語辞書の作成 »