OpenEXRライブラリを使いたい
従来の8bit画像にくらべ、精度の高い(=half floatやfloat)画像をHDR画像(High Dynamic Range image)といいます。
拡張子が.hdrや.exrなどがそうなのですが、exrの読み書きにOpenEXRというライブラリがあるそうです。
http://www.openexr.com/index.html
今回はこのOpenEXRをC++で使おうという話。
ライブラリをバイナリとしては提供されていなくて自分でビルドする必要があります。readme.txt通りにやるとうまく行かず四苦八苦していたのですが、
http://www.fixstars.com/en/lucille/docs/dev/index.php/How_to_build_OpenEXR_libs_for_Win_64bit
にあるようにstatic libraryにしてビルドするとうまくlibが生成されるようになりました。
微妙にやることがいろいろあるのでひと通り作業をまとめます。
実行環境
- VisualStudio2012 Professional
- openexr-2.1.0
- ilmbase-2.1.0
- zlib-1.2.5
です。
ファイルの取得
- http://www.openexr.com/downloads.htmlからopenexr-2.1.0.tar.gz及びilmbase-2.1.0.tar.gzをダウンロードして解凍。
- http://www.winimage.com/zLibDll/index.htmlからソース(zlib125.zip)とバイナリ(zlib125dll.zip)をダウンロードして解凍。
IlmBaseについて
デフォルトではdll作成をする設定になっていますが、dll作成の場合には「Iex::MathExc::MathExc(char const *)の定義がない」などのエラーでコンパイルが通らないのでstatic libraryを生成するように設定を変更する。(dllでコンパイルが通った方はやり方教えてください。)
コード生成についてはzlibがマルチスレッドDLLなのでMDを設定しておきます。
以下の設定をDebug/Releaseの両方で指定。
- ilmbase-2.1.0\vc\vc8\IlmBaseにあるソリューションファイルIlmBase.slnを開く。
- [ビルド]-[構成マネージャー]を開き、ビルドのチェック項目をつぎの項目のみにする。
- Half
- Iex
- IlmThread
- Imath
- Halfプロジェクトのプロパティを開き、[構成プロパティ]-[C/C++]-[全般]-[追加のインクルードディレクトリ]に..\..\..\..\config.windowsを追加
- Half/IlmThread/Imathプロジェクトのプロパティを開き、[構成プロパティ]-[C/C++]-[プリプロセッサ]-[プリプロセッサの定義]から「OPENEXR_DLL」を削除
- Half/Iex/IlmTHread/Imathプロジェクトのプロパティを開き、[構成プロパティ]-[ビルドイベント]-[ビルド後イベント]-[コマンドライン]の内容を削除
- Debug/Releaseビルド
OpenEXRについて
- [ビルド]-[構成マネージャー]を開き、ビルドのチェック項目をIlmImf・IlmImfExampleのみにする。
- ソリューションエクスプローラー上でIlmImfプロジェクトを右クリック、追加で「openexr-2.1.0\IlmImf」内のヘッダとソースをすべて追加する。(標準だとすべて入っておらずリンクエラーが出る。)
- IlmImfプロジェクトのプロパティで、[構成プロパティ]-[ライブラリアン]-[追加の依存ファイル]に、Half.lib;Iex.lib;IlmThread.lib;Imath.lib;zlibstat.libを追加。
- 同じくIlmImfプロジェクトのプロパティで、[構成プロパティ]-[ライブラリアン]-[追加のライブラリディレクトリ]に「..\..\..\..\..\zlib125dll\staticx64」「..\..\..\..\..\ilmbase-2.1.0\vc\vc8\IlmBase\x64\release」を追加。(debug/releaseはコンフィギュレーションに合わせて変えてください。)
- IlmImfプロジェクトのプロパティで、[構成プロパティ]-[C/C++]-[プリプロセッサ]-[プリプロセッサの定義]から「OPENEXR_DLL」を削除
以上の操作で無事OpenEXRのstaticライブラリが生成されるはずです。
IlmImfExampleについて
- IlmImfプロジェクトのプロパティで、[構成プロパティ]-[C/C++]-[全般]-[追加のインクルードディレクトリ]に「..\..\..\..\IlmImf;..\..\..\..\config.windows;..\..\..\..\..\zlib-1.2.5;..\..\..\..\..\ilmbase-2.1.0\Imath;..\..\..\..\..\ilmbase-2.1.0\IlmThread;..\..\..\..\..\ilmbase-2.1.0\Iex;..\..\..\..\..\ilmbase-2.1.0\Half;..\..\..\..\..\ilmbase-2.1.0\config.windows;%(AdditionalIncludeDirectories)」を追加
- IlmImfプロジェクトのプロパティで、[構成プロパティ]-[リンカー]-[全般]-[追加のライブラリディレクトリ]に、「..\..\..\..\..\openexr-2.1.0\vc\vc8\OpenEXR\x64\Release;」を追加。
- IlmImfプロジェクトのプロパティで、[構成プロパティ]-[リンカー]-[入力]-[追加の依存ファイル]に、IlmImf.libを追加。
これできっと実行できるはず。