2011年11月5日土曜日

FreeImage

・・・というわけで、前回、
System.Drawing.BitmapはJPEGの画質が悪すぎる
ということが判明したので、
その代わりに使えそうなものを探してみたわけです。

まず、最初に見つけたのが

「libjpeg」(IJG JPEGライブラリ)
公式サイト http://www.ijg.org/

が、調べてみると、どうも、
・Cで書かれたソースコードで配布されている。
・プログラムに直接ソースコードを組み込んで使うのが、もっぱらの利用法。
・DLLにできなくもないが、なかなかに面倒らしい。
・誰かDLL作ってバイナリ公開してないかな-、と思ったが見つからない。
・そんなこんなで、.NETで利用するのも難しそう。
というわけで、ひとまず諦める。

そして見つけた第2候補。

「FreeImage」
公式サイト http://freeimage.sourceforge.net/

・オープンソースなライブラリ。
・PNG, BMP, JPEG, TIFF, など、いろんなフォーマットに対応している。
・Windows, Linux, Mac OS X などの各OSに対応。32bit、64bit両方に対応。
・C, C++, VB, C#, Delphi, Java, Perl, Python, PHP, TCL, Ruby, と対応言語はよりどりみどり。
・使い方が簡単(らしい)。
・C#でのFreeImageの使い方とかを説明してくれているような日本語のサイトをgoogle先生は知らないようだ。(英語でもほとんど無いっぽい。)

.NETから使えそうなので、
とりあえずいじってみよう、ということでダウンロード。

で、結論から言うと、
これはなかなか良さそうです。
使い勝手も良いし、機能も豊富です。
ちゃんとJPEGを本来の画質で読み込めるし、
読み込んだ画像をSystem.Drawing.Bitmapのインスタンスとして取得したり、
逆にSystem.Drawing.BitmapのインスタンスをFreeImageのAPIで
いろんなフォーマットでファイルに書き出したりもできる。

以下、ダウンロードしたFreeImageの使い方など。

ダウンロードしたのは
"FreeImage3151Win32.zip" というファイル。
解凍されたファイルの中には、
"Wrapper\FreeImage.NET\cs\"フォルダ内にVisualStudio2005のソリューションファイルが。
これをVisualStudio2010で開くとプロジェクトの変換が行われるが、特に問題なく変換される。

が、ビルドしようとするとうまくいかないので、多少設定をいじる必要有り。

まず、"Library.2005"というプロジェクトのプロパティを開き、
「ビルド」タブの「警告をエラーとして扱う」という項目で「すべて」が選択されているので、
それを「なし」に変更。

同じく、"Library.2005"プロジェクトに、ソリューションエクスプローラーでコンテキストメニューから
「追加」 - 「既存の項目」で、
解凍されたFreeImageのフォルダに入っている
"FreeImage\Dist\FreeImage.dll"を追加。
これがネイティブなFreeImageのライブラリ。
(で、今ビルドしようとしているのが、このDLLのラッパー。)

最後に、ソリューションに"UnitTest.2005"というプロジェクトが含まれているので、それをソリューションから削除。

これでビルドができるはず。
サンプルがたくさん入っているので、
それを見れば、必要そうな使い方も一通りわかるはず。
シンプルなAPIになっていて、割と簡単そうです。


今回は、このあたりで。
日本語の情報が少ないようなので、
そのうち、まとめ直したりしてHPのほうにUPしておこうと思います。

4 件のコメント:

匿名 さんのコメント...

質問させて下さい。GLShapのSimpleTrinagle.csをベースに、STLを読み込んで表示させましたが、べた塗りの形状は表示できますが、立体的に見えません。TextSample.csにgl.Begin(BeginMode.Triangles)で描画はできませんでした。どうしたらよいでしょうか?

一歩二歩散歩 さんのコメント...

SimpleTrinagle.csは、ライティングをオフにしているので、むしろベタ塗りのようになるのが正しい描画結果です。
gl.Enable( EnableCaps.Lighting );
とすることでライティングがオンになりますが、ライティング関連のパラメータもいろいろと設定する必要があります。

TextSample.csについては、gl.Begin(...)で描画できない、ということは無いはずですが、どう描画できないのかわからないので何ともいえません・・・。

匿名 さんのコメント...

ありがとうございます。ライティングオンで、解決しました。描画できなかったのは、私の間違いでした。
もう一つ質問があります。座標の原点でカメラを回転している設定を任意の点を中心に回転するには、どうしたらいいでしょうか?

一歩二歩散歩 さんのコメント...

サンプルのプログラムではCameraクラスを使っているわけですが、 Camera.center が回転の中心になっています。
TextureSample.csの OnMouseMove(...)メソッドあたりを見ればわかると思います。