JPEGファイルのフォーマットや離散コサイン変換(DCT)など、だいぶ格闘しました。
大雑把には理解したものの結局のところ実装はとっても大変なことも理解できました。
JPGには通常の形式の他に、拡張されてExifだの、プログレッシブ形式だの、Motion JPGやJPEG2000といった規格まで、個人で闘うのは無理があります。
MinGWの環境で、すぐに使えそうなライブラリを探したところこちらで発見しました。
Syuhituさんの解説「JPEGファイルの入出力」
実際はこのページにあるIJG(Independent JPEG Group)による「jpeglib」をダウンロードして使います。
ダウンロードした jpegsr9a.zip を解凍します。
MinGWのコンソールを立ち上げて、解凍先ディレクトリに移動して、install.txt の指示にある通り、
> ./configure
とコマンドを叩きます。
このシェルスクリプトは、ユーザのMinGWの環境をいろいろチェックして、jconfig.h というインクルードファイルと Makefile という jpeglib を作成(make)するためのファイルを出力します(というのを後日突き止めた)。
私の環境に合わせて作成された Makefile ができたので次のコマンドを叩きます。
> make
70個くらいの .c ファイルを次々とコンパイルするはずが、2個目でコンパイルエラーで終わります。関数プロトタイプが以前の定義と異なっていまっせ、というエラーメッセージ。
原因を探るのに1日かかりました。(初日はいったん諦め、次の日に怪しいファイルに当たりをつけてやってみたらうまくいったので、実際は10分くらいです^^)
初日、cofigure が jconfig.h を出力しているのを理解できたので環境チェックミスを疑いました。
jconfig.h の冒頭で
#undef HAVE_PROTOTYPES
というのがあり、これを
#define HAVE_PROTOTYPES 1
に修正することによって make はエラーなしで最後まで実行できました。
ただし、warning は7つの .c ファイルで発生しています。
メッセージは exit 関数が implicit function で存在して、既存の exit 関数と conflict してるよ、だったので
jerror.c, cjpeg.c, rdgif.c, djpeg.c, jpegtran.c, rdjpgcom.c, wrjpgcom.c
の7つファイルの最初のほうに
#include <stdlib.h>
を追加して再度 make 、ワーニングは消えました。
サンプルを見ながら、JPGファイルを読み込み/グリーン成分だけをグレイスケールJPGで出力するプログラムを書いてみました。
最初、libjpeg-9.dll が無いというエラーで実行できませんでした。
このダイナミックリンクライブラリファイルを同一フォルダにコピーすれば実行できることはわかりましたが、配布のことを考えると static リンクするべきです。
static library である libjpeg.a を同一フォルダにコピーしてきて
> gcc -o a.exe test.o -L. -ljpeg
というコマンドを叩きます。-L. (. カレントディレクトリ)にある -ljpeg (= libjpeg.a 指定) とリンクせよという意味です。
できあがった a.exe を実行してみます。
> a.exe > b.jpg
JPG入力ファイル(先日の新潟のキャンプ場で撮影したトカゲです)
JPG出力ファイル(G成分をグレイスケールとして出力)
うまく読み(read)書き(write)そろばん(data modify)できました(≧▽≦)
この結果を利用して近々 keypoint プログラムのマイナーバージョンアップ予定です。
大雑把には理解したものの結局のところ実装はとっても大変なことも理解できました。
JPGには通常の形式の他に、拡張されてExifだの、プログレッシブ形式だの、Motion JPGやJPEG2000といった規格まで、個人で闘うのは無理があります。
MinGWの環境で、すぐに使えそうなライブラリを探したところこちらで発見しました。
Syuhituさんの解説「JPEGファイルの入出力」
実際はこのページにあるIJG(Independent JPEG Group)による「jpeglib」をダウンロードして使います。
ダウンロードした jpegsr9a.zip を解凍します。
MinGWのコンソールを立ち上げて、解凍先ディレクトリに移動して、install.txt の指示にある通り、
> ./configure
とコマンドを叩きます。
このシェルスクリプトは、ユーザのMinGWの環境をいろいろチェックして、jconfig.h というインクルードファイルと Makefile という jpeglib を作成(make)するためのファイルを出力します(というのを後日突き止めた)。
私の環境に合わせて作成された Makefile ができたので次のコマンドを叩きます。
> make
70個くらいの .c ファイルを次々とコンパイルするはずが、2個目でコンパイルエラーで終わります。関数プロトタイプが以前の定義と異なっていまっせ、というエラーメッセージ。
原因を探るのに1日かかりました。(初日はいったん諦め、次の日に怪しいファイルに当たりをつけてやってみたらうまくいったので、実際は10分くらいです^^)
初日、cofigure が jconfig.h を出力しているのを理解できたので環境チェックミスを疑いました。
jconfig.h の冒頭で
#undef HAVE_PROTOTYPES
というのがあり、これを
#define HAVE_PROTOTYPES 1
に修正することによって make はエラーなしで最後まで実行できました。
ただし、warning は7つの .c ファイルで発生しています。
メッセージは exit 関数が implicit function で存在して、既存の exit 関数と conflict してるよ、だったので
jerror.c, cjpeg.c, rdgif.c, djpeg.c, jpegtran.c, rdjpgcom.c, wrjpgcom.c
の7つファイルの最初のほうに
#include <stdlib.h>
を追加して再度 make 、ワーニングは消えました。
サンプルを見ながら、JPGファイルを読み込み/グリーン成分だけをグレイスケールJPGで出力するプログラムを書いてみました。
最初、libjpeg-9.dll が無いというエラーで実行できませんでした。
このダイナミックリンクライブラリファイルを同一フォルダにコピーすれば実行できることはわかりましたが、配布のことを考えると static リンクするべきです。
static library である libjpeg.a を同一フォルダにコピーしてきて
> gcc -o a.exe test.o -L. -ljpeg
というコマンドを叩きます。-L. (. カレントディレクトリ)にある -ljpeg (= libjpeg.a 指定) とリンクせよという意味です。
できあがった a.exe を実行してみます。
> a.exe > b.jpg
JPG入力ファイル(先日の新潟のキャンプ場で撮影したトカゲです)
JPG出力ファイル(G成分をグレイスケールとして出力)
うまく読み(read)書き(write)そろばん(data modify)できました(≧▽≦)
この結果を利用して近々 keypoint プログラムのマイナーバージョンアップ予定です。

