087807 ランダム
 HOME | DIARY | PROFILE 【フォローする】 【ログイン】

風呂ゲルゲ

風呂ゲルゲ

メモ IJGをVCに実装


オープンソースを使った JPEG 操作
最終更新日:2000/02/20
 JPEG ファイルを操作する為のユーティリティは、フリーソフトでも、
結構たくさんあるのですが、
いざ、「自分の思った操作をしたい」と思った時、なかなか、それに適する
ものは見つからないのものです。

例えば、私が欲しかったのは、ファイルからでは無く、メモリ上にある
JPEG イメージを、直接、DIB(BMP イメージ)に変換して、
アプリケーションで、自由に表示処理を行いたい、というものです。
というのも、最近は、DBMS 中に BLOB(バイナリラージオブジェクト)型
として、バイナリイメージを格納出来ますが、これを直接表示する手段は
限られています。
Web 経由であれば、単に、CGI で、標準出力(stdio)へそのまま出力すれば、
ブラウザが表示してくれるので、手間はかからないのですが、そうで無い場合は、
簡単ではありません。

【 フリーソフトを使う 】

 実際、探したのですが、目的にかなう DLL はありません。
特に、ソースを公開しているものは皆無に近いです。

【 JPEG 操作を1から作る? 】

 4~5年前の昔ならいざ知らず、画像処理を専門に扱う人や、
勉強の為なら別ですが、今さら、そこまで自分で作り上げるのは
あまり意味が無いように思います。そもそも、速度の最適化や、テストの
事まで考えると、能力的にも、時間的にも難しいでしょう。

【 オープンソースを使う 】

 そこで、多少手間でも、オープンソースを使わせていただく
事にしました。幸い

Independent JPEG Group's software
ftp://ftp.uu.net/graphics/jpeg/

で公開されています。
私が使用したバージョンは、JPEG-6b です。

まず、ファイルをダウンロードし、unzip で展開して、中のドキュメントに
目を通します。
当然、全て英語(苦手です!)ですが、これを日本語で解説したサイトは
残念ながら見つけられませんでした。

ライセンスについては、次の点が、とりあえず重要だと思います。

------------- README より抜粋 --------------------------------------

1. We don't promise that this software works.
(But if you find any bugs, please let us know!)
2. You can use this software for whatever you want.
You don't have to pay us.
3. You may not pretend that you wrote this software.
If you use it in a program, you must acknowledge somewhere
in your documentation that you've used the IJG code.

1. われわれは、このソフトウェアが動作する事を保証しません。
(でも、もしあなたがバグを見つけたら、わたしたちに知らせて下さい!)
2. あなたはどんなものにでも、このソフトウエアを使えます。
あなたはわれわれに(金銭を)支払う必要はありません。
3. あなたは、このソフトを自分で書いたと偽ってはなりません。
もしプログラムでこれを使うなら、あなたのドキュメントのどこかで、
IJG コードを使った事を認めなければなりません。
--------------------------------------------------------------------

※ 私の使っている IE4.0 でも IJG の著作権表示があります。(^o^)

IJG のソースコードは、特別な環境(Windows 環境等)に特化された
ものでは無く、UNIX をはじめ、多くのプラットフォームで
使えるように、共通化されています。
今回は、Windows(WIN32) 環境で使う事を前提に話をすすめます。

【 ライブラリの作成(ビルド) 】

 IJG のこのパッケージは、ライブラリ(LIB)の提供を主な目的に
しています。コンパイル済みのバイナリイメージは、
言語製品や、プラットフォームごとに違ってくるので、特に、
提供されていないようです。従って、自分で作成(make)する事になります。

README に続いて、install.doc にも目を通しましょう。

とりあえず、ビルドする為には、プラットフォーム用の makefile
をコピーします。
私の場合、WIN32 で、VC++ を使うので、makefile.vc を makefile に
コピーしました。
それと、jconfig.h も、各プラットフォーム用をコピーします。
(jconfig.vc -> jconfig.h)

後は、コンソール(DOS 画面)で make(nmake) するだけです。
(統合環境でも使用可能なようですが、私は、使わない主義です。
注釈がありますので、必要なら読んで下さい。)

この IJG パッケージの中には、ライブラリの他に、それを使った
アプリケーション例も入っています。
ビルドすると、次のイメージが出来ます。

CJPEG.EXE --- JPEG 圧縮
DJPEG.EXE --- JPEG 解凍
JPEGTRAN.EXE --- JPEG 変換
RDJPGCOM.EXE --- JFIF コメント読み取り
WRJPGCOM.EXE --- JFIF コメント書き込み

CJPEG.EXE、DJPEG.EXE は、BMP ファイルと、JPEG ファイルとの
相互変換に使えます。
圧縮、解凍以外のものは、私には良くわかりません。(読んでいません)
当然、すべてコマンドラインツールですので、使い方のサンプルという
位置付けのようです。

ライブラリは、

LIBJPEG.LIB

として作成されます。

【 自分で、簡単なサンプルアプリケーションを作ってみよう! 】

 何はともあれ、自分で簡単な例を書くのが最初でしょう。
まず、簡単なプログラムとして、

「JPEG ファイルから BMP ファイルに変換するプログラム」

上記の手順が一通り理解できれば、同様に、

「BMP ファイルから JPEG ファイルに変換するプログラム」

は簡単でしょう。

次に、DLL 化の課題について考えてみましょう

IJG JPEG ライブラリの DLL 化

応用として、ファイルへの入出力ではなく、メモリ上で、
形式を変換する方法についても考えてみましょう。

入力マネージャのカスタマイズ





VC++をMSDOSプロンプトから使う
インストール時にこのことに関するテキストファイルが表示されるんですが、結構忘れてしまうので.(99/1/5)
ちなみにWindows98での話です。

DOS窓からC:\Program Files\DevStudio\VC\bin\vcvars32.bat(c:\progra~1\devstu~1\vc\bin\vcvars32.bat)を実行する。これにより、VC++のツールを使う為の環境変数が設定される。
上記のバッチファイルを実行すると、「環境変数のための領域が足りません」とエラーが出ることがありますが、そのときは、
>command.com /E:1024としてその場で環境変数の領域を増やすか、あるいは

DOS窓のプロパティーで、環境変数のための領域を増やしてください。1024でOKです。


libjpegのVC++でのメイク方法

--------------------------------------------------------------------------------
これは全然苦労しませんね。でも一応メモとして。
予めVC++をDOS窓から使うの準備をして、 jpegsr6.zipを展開して出来るjpeg-6bにDOS窓で移り、
jconfig.vcをjconfig.hにリネームして、
nmake -f makefile.vc
でOK.初めてだと、最後に

del libjpeg.lib
libjpeg.lib が見つかりませんでした。
NMAKE : fatal error U1077: 'del' : リターン コード '0x1'
Stop.

とエラーになるので(まだ作っていないlibjpeg.libを消そうとしてる)、makefile.vcを編集。
$(RM) libjpeg.lib をコメントアウトして再実行。
libjpeg.libが出来れば成功。
--------------------------------------------------------------------------------
C++から使うときは、そのままだと、
error LNK2001: 外部シンボル ""unsigned char __cdecl jpeg_finish_decompress(struct jpeg_decompress_struct *)" (?jpeg_finish_decompress@@YAEPAUjpeg_decompress_struct@@@Z)" は未解決です
error LNK2001: 外部シンボル ""unsigned int __cdecl jpeg_read_scanlines(struct jpeg_decompress_struct *,unsigned char * *,unsigned int)" (?jpeg_read_scanlines@@YAIPAUjpeg_decompress_struct@@PAPAEI@Z)" は未解決です
error LNK2001: 外部シンボル ""unsigned char __cdecl jpeg_start_decompress(struct jpeg_decompress_struct *)" (?jpeg_start_decompress@@YAEPAUjpeg_decompress_struct@@@Z)" は未解決です
error LNK2001: 外部シンボル ""int __cdecl jpeg_read_header(struct jpeg_decompress_struct *,unsigned char)" (?jpeg_read_header@@YAHPAUjpeg_decompress_struct@@E@Z)" は未解決です
error LNK2001: 外部シンボル ""void __cdecl jpeg_stdio_src(struct jpeg_decompress_struct *,struct _iobuf *)" (?jpeg_stdio_src@@YAXPAUjpeg_decompress_struct@@PAU_iobuf@@@Z)" は未解決です
error LNK2001: 外部シンボル ""void __cdecl jpeg_CreateDecompress(struct jpeg_decompress_struct *,int,unsigned int)" (?jpeg_CreateDecompress@@YAXPAUjpeg_decompress_struct@@HI@Z)" は未解決です
error LNK2001: 外部シンボル ""void __cdecl jpeg_destroy_decompress(struct jpeg_decompress_struct *)" (?jpeg_destroy_decompress@@YAXPAUjpeg_decompress_struct@@@Z)" は未解決です
error LNK2001: 外部シンボル ""struct jpeg_error_mgr * __cdecl jpeg_std_error(struct jpeg_error_mgr *)" (?jpeg_std_error@@YAPAUjpeg_error_mgr@@PAU1@@Z)" は未解決です
fatal error LNK1120: 外部参照 8 が未解決です。

なので、 jpeglib.hを
#include "jmorecfg.h" /* seldom changed options */
#ifdef __cplusplus
extern "C" {
#endif

......

#endif /* INCOMPLETE_TYPES_BROKEN */
#ifdef __cplusplus
}
#endif

にしてしまうのも手。



http://www.amy.hi-ho.ne.jp/jbaba/jpeg1.htm
http://homepage1.nifty.com/nekora/soft/howto/libjpeg.html
http://homepage1.nifty.com/nekora/soft/howto/vcvars32.html


© Rakuten Group, Inc.