2014-07-06 3 views
1

LibTIFF 라이브러리를 사용하여 이미지를 저장하는 데 문제가 있습니다.32 비트 TIFF 이미지가 흰색으로 보입니다. RAW와 다릅니다

내 코드에는 이미지의 픽셀 값을 나타내는 float 배열이 있습니다. 이 값을 RAW 파일에 저장하면 잘 보입니다. 그러나 LibTIFF 라이브러리를 사용하여 TIFF 파일로 저장하려고하면 ImageJ에서 이미지를 열 때 이미지가 완벽하게 잘 보이지만 Photoshop이나 Windows에서 이미지를 열면 이미지가 이상하게 보입니다 (아래 참조). Gimp는 완전히 투명한 이미지 (이미지에 데이터가 전혀없는 것처럼).

ImageJ를 사용하여 RAW 파일을 열면 이미지 유형이 32 비트로 설정됩니다. 실제 및 리틀 엔디안 바이트 순서가 선택됩니다. 여기

RAW on the left, TIFF on the right

내가 TIFF 이미지를 저장하는 데 사용하는 코드입니다 :

TIFF *tif= TIFFOpen(name, "w"); 

TIFFSetField (tif, TIFFTAG_IMAGEWIDTH, width); 
TIFFSetField (tif, TIFFTAG_IMAGELENGTH, height); 
TIFFSetField (tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); 
TIFFSetField (tif, TIFFTAG_SAMPLESPERPIXEL, 1); 
TIFFSetField (tif, TIFFTAG_ROWSPERSTRIP, 1); 
TIFFSetField (tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE); 
TIFFSetField (tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); 
TIFFSetField (tif, TIFFTAG_BITSPERSAMPLE, 32); 
TIFFSetField (tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); 

tsize_t strip_size = TIFFStripSize (tif); 
tstrip_t strips_num = TIFFNumberOfStrips (tif); 

float* strip_buf=(float*)_TIFFmalloc(strip_size); 
for (unsigned int s=0; s<strips_num; s++) { 
    for (unsigned int col=0; col<width; col++) { 
     strip_buf[col]=image[s][col]; 
    } 
    TIFFWriteEncodedStrip (tif, s, strip_buf, strip_size); 

} 
_TIFFfree(strip_buf); 
TIFFClose(tif); 

뭔가 내가 파일을 저장하고있어 길을 잘못 확신을 -하지만 난 아무 생각이 무엇인지 . 도와 주셔서 정말로 고맙습니다!

답변

0

Windows 이미지 뷰어가 32 비트 TIFF를 제대로 처리하지 못한다는 점에있어 문제가 있습니다. LibTIFF에 대해 아무것도 알지 아니, 난 당신이 대신 328에 코드에서 해당 라인을 조정하여 만든 TIFF의 비트 깊이를 변경할 수 있습니다 가정 거라고, 그래서 다음과 같이 읽습니다

그러나
TIFFSetField (tif, TIFFTAG_BITSPERSAMPLE, 8); 

, 제발 원래 데이터가 8 비트로 표현 될 수있는 것보다 더 많은 강도 값을 갖는 경우 이것이 정보 손실로 이어질 것이라는 것을 알고 있습니다. 그리고 LibTIFF가 스케일링을 어떻게하는지 전혀 모르겠습니다.

Windows/Gimp/Photoshop에서 정확하게 표시하지 않는다고해서 TIFF 파일이 손상되었다고 의미하지는 않습니다.

+1

스크린 샷의 오른쪽 그림을 보면, 이것이 32 비트 TIFF 파일의 하위 8 비트에 불과하다고 생각됩니다. Windows 이미지 뷰어는 부분적으로 만 이해할 수있는 부분을 발견했을 때 그럴 것입니다.) – he1ix

3

이미지가 32 비트로 플로팅되어 있음을 나타내려면 다음 줄을 추가해야 할 수 있습니다.

TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); 

그리고 나서 플로트 이미지를 읽을 수있는 프로그램에 문제가 없어야합니다.

+0

나를 구해 줬습니다! 일반적인 availabel libtiff-tutorials에는 그다지 귀중한 힌트가 없습니다. – Pepschmier