2017-10-10 9 views
0

私のプロジェクトでopenexrイメージを解読するためにopenexrソースコード(http://www.openexr.com/downloads.htmlからダウンロード)を含めました。64ビットマシンでopenexrファイルを開こうとしたときにopenexrがクラッシュする

私は、64ビットのための私のプロジェクトを構築しました(Mac上だけでなく、Windowsの場合)と、以下のファイルを開こうとしています https://github.com/openexr/openexr-images/blob/master/ScanLines/Blobbies.exr

これのOpenEXRファイルを開いている間にそれはOpenEXRのソース内のクラッシュを。

rgbaFile = new Imf :: RgbaInputFile( "Blobbies.exr");

rgbaFile-> setFrameBuffer(ピクセル - データウィンドウ.min.x - (y * exrDimension.mWidth)、1、mWidth);

rgbaFile-> readPixels(datawindow.min.y、datawindow.max.y);

このファイルには、データウィンドウ(-20、-20)〜(1020,1020)と表示ウィンドウ(0,0)〜(999,999)があります。

私のプロジェクトの32ビットビルドで試してみると、正しく開くことができます。

答えて

0

私は問題の原因を発見しました。 問題は、APIのOpenEXRではなくsetFrameBuffer(に渡されるパラメータ ではない)、すなわち

画素 - datawindow.min.x - (Yの*のexrDimension.mWidth)ここで

、yはINT32でありますexrDimension.mWidthは符号なしint32型です。これらの2つが掛け合わされると、unsigned int32型の値が非常に大きくなります。式onの結果の全体的な型は、setFrameBuffer関数の中で受け取ったときに異なります。それはマシンのアーキテクチャに依存します。 archが32ビットの場合はint32、64ビットのアーチの場合はint64です。

32ビットアーチでは、全体的な結果は正しい値を示すint32に型キャストされますが、64ビットのアーチでは、この値は負のyによって正しくないため、符号なしint32では表現できません。

関連する問題