2017-10-10 19 views
0

내 프로젝트에서 openexr 이미지를 디코딩하기 위해 openexr 소스 코드 (http://www.openexr.com/downloads.html에서 다운로드)를 포함 시켰습니다.64 비트 컴퓨터에서 openexr 파일을 열 때 openexr에서 크래시가 발생합니다.

나는 (창 Mac에서뿐만 아니라에서) 64 비트 내 프로젝트를 구축하고 다음과 같은 파일을 열려고 한이하면 OpenEXR 파일을 여는 동안 그것은 OpenEXR을 원 내부 충돌 https://github.com/openexr/openexr-images/blob/master/ScanLines/Blobbies.exr

합니다.

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

rgbaFile-> setFrameBuffer (pixel - datawindow.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

문제점의 원인을 발견했습니다. 문제는,하면 OpenEXR API뿐만 파라미터 setFrameBuffer()에 전달되는 가 아닌 즉

화소 - datawindow.min.x - (Y의 *의 exrDimension.mWidth) 여기서

는, Y는 INT32이며 exrDimension.mWidth는 부호없는 int32 유형입니다. 이 두 값이 곱해질 때 unsigned int32 타입의 값이 매우 큽니다. 식의 결과의 전체 유형은 setFrameBuffer 함수 내부에서 수신 될 때 달라집니다. 그것은 기계의 구조에 달려 있습니다. 아치가 32 비트이면 int32이고 64 비트 아치이면 int64입니다.

32 비트 아치에서 전체 결과는 올바른 값을 제공하는 int32로 유형 변환되지만 64 비트 아치에서는 y가 음수로 잘못되어이 값이 부정확하며 부호없는 int32로 표현 될 수 없습니다.