▽jpegファイルの操作

The Independent JPEG Groupのライブラリ(以下、IJG)を利用してjpeg形式のファイルを直接操作するクラスを作ってみました。もちろん、これまでに作ったskZipIOやskPngIOと同様の操作が可能です。

最新のskLibはこちら。

skLib ver 1.0 [033]
sklib-033.lzh

サンプルプログラムはskLibを使用しています。ソースコードをコンパイルする際はあらかじめ、skLibの環境を整えておいてください。

○jpeg入出力のサンプル

サンプルプログラムはこちら。

jpeg入出力
sk03d-21.lzh

png入出力のサンプルをjpeg向けに改造したものです。

jpeg入出力のサンプル
jpeg入出力のサンプルの図

プログラムとしてはskJpegIOクラスを利用してjpegファイルを読み書きしているだけです。

今回、標準ではskJpegIOクラスを利用してjpegファイルの読み書きを行っていますが、その他に、IJGをラップするために作ったskjpegクラスを使った場合のテスト機能も実装してあります。

メニューの[skjpeg]から読み込み/書き込みを実行した場合、こちらの機能が使われます。当たり前といっては当たり前ですが、skJpegIOクラスを使った場合と動作は同じですw

ついでに(?)グレイスケールでの入出力にも対応てたりします。データを読み込むときは自動的に24ビットカラーのデータに変換されます。データを保存するときは、あらかじめメニューの[skjpeg] - [グレイスケールで保存]にチェックを入れておけば、グレイスケールで保存されます。

○skJpegIOクラスについて

skJpegIOクラスはIJGを利用していますが、IJGにはいくつか問題点があるためそれなりに工夫してあります。

IJGの問題点はこんな感じ。

ヘッダファイルがバッティングする
Win32やMFCのヘッダと同時に使おうとするとバッティングが発生します。特に“INT32”がバッティングする問題が有名なのかな? GnuWin32で再配布されてるアーカイブだと、この問題を回避するためにヘッダファイルが修正されてたりします。
入出力がFILE*系のみ
ライブラリの標準的な入出力はjdatadst.cとjdatasrc.cで実装されていて、これがFILE*系列に依存した作りになっています。まぁ、でも、この問題に関しては、ちゃんと置き換えができるようにライブラリができてるので問題とはいえないのかな?

他にも『コメントに対応してない』とか、細かいところはいろいろあるんですけど細かいところには見なかった事にしました。

で、問題を避けるために、IJGをラップするクラスを標準C++で書いて、MFC向けに使うときはそれをさらにラップする事にしました。図にするとこんな感じ。

ライブラリ&クラス構成
ライブラリ&クラス構成

skjpeg_coreはIJGを使うときの変数や構造体を隠蔽するためのクラスです。skjpegからskjpeg_coreを分離する事で、IJGを外から隠蔽してます。

ちなみに、C++でのこういうテクニックは『クラスが異常におおきくなったとき』や『privateより強力に内部を保護したいとき』などなど、よく使われるテクニックですな。っていうか、テクニックって言うまでもない基本事項?(´∀`;)

skjpegまでは完全に標準C++の範囲で書いてあります。内部的にはかなりWin32を意識してますが・・・ ん〜本当なら、ここも、一般的に書いた方が良いんでしょうけど、ぶっちゃけ、skjpegをその他の環境で使うと思えないので割り切ってます。

まぁ、いざというときは、また、そのときに対応という事で。

skJpegIOがWin32向けの最終的なjpeg入出力クラスです。このクラスになると入出力はファイル単位・もしくはCFile経由になります。


[skLib] Presented by See.Ku [2005/2/5]