2010-01-11 5 views
9

매우 큰 TIFF 파일에 액세스하려면 LibTiff를 사용하고 싶습니다. 여러 페이지와 타일 같은 기능이 필요하므로 LibTiff가 올바른 방법 인 것 같습니다. 누구든지 C#에서 LibTiff를 사용하는 방법에 나를 도울 수 있습니까? 몇 가지 링크를 발견했습니다 (부분 코드가 포함 된 blog.bee-ee과 같은 버전입니다.) 그러나 FreeImage을 살펴 보았지만 적합하지 않음을 알았습니다 (그림은 약 800x8 또는 16 비트 회색조 - > 800-1600 MByte) 크기이고 32 비트 환경에서 메모리에로드 할 수 없습니다.C#에서 LibTiff 사용 (타일 된 TIFF 이미지에 액세스)

저는 C/C++에서 경험이 많지만 C#에서는 아직 익숙하지 않습니다. 누구나 래퍼 또는 힌트를 도울 수 있습니까?

참고 : 티파니의 피라미드 평면 (다중 해상도)에 액세스하려면 페이지가 필요하고 이미지를로드하지 않고 이미지의 다른 부분에 빠르게 액세스하려면 256x256의 타일을 사용해야합니다.

[편집] LibTIFF.NET 솔루션이 가장 실용적이었습니다. 이제는 제품 개발 과정에서이를 통합하고 있으며, 관리 메모리로/밖으로 나가는 두통을 적절하게 저해 할 것입니다. 아직 '콜백 (callback)'기능을 시도한 적이 없으며 .net 방식으로 멋지게 해결되는 것으로 보입니다. Stackoverflow 도움말에 감사드립니다. [/ 편집]

답변

6

우리 LibTiff.Net을 사용해보십시오. 그것은 관리되는 C#을 사용하여 작성된 LibTiff의 무료 오픈 소스 버전입니다. 구현 된 API는 원래 API와 매우 유사하게 유지되었습니다.

http://bitmiracle.com/libtiff/

우리는 단지 그것을 출시, 그래서 버그가있을 수 있습니다. 하지만 전체 소스 코드에는 많은 테스트가 포함되어 있으므로 가장 확실한 버그가 수정되어야합니다.

+0

감사. 첫 번째 테스트가 잘되고 있습니다. 래퍼 클래스를 찾았지만 알려진 작성자가 없기 때문에 조만간 관리되는/관리되지 않는 메모리 리소스에 대한 액세스 문제가 발생합니다. 벤치 마크 결과 압축되지 않은 파일을 읽을 때와 동일한 성능을 보였고 Adobe 압축 피라미드 타일의 tiff는 50 %의 성능을 보였습니다. 이것은 나를 위해 받아 들일 만하다. 압축을 사용하지 않기로 결정할 수도 있습니다. 메모리 문제를 해결하는 것보다 소프트웨어를 멀티 코어 환경에 우호적으로 만드는 것이 더 좋습니다. – Adriaan

+0

감사합니다, Adriaan 우리의 구현은 당연히 원래의 선택 언어보다 느립니다 :-) – Bobrovsky

+0

괜찮습니다. 내 프로젝트 성과는 기능성/유로를 의미합니다. 개발 시간은 비용의 95 %입니다. 나는이를 보상하기 위해 쿼드 코어를 쉽게 던질 수있다. 게다가 내가 압축을 풀면 차이가 작다. 그리고 내 파일은 약 10 % 만 압축하므로 파일 당 약 100MByte입니다 ;-) – Adriaan

4

WIC는 매우 큰 이미지 파일을 지원합니다. .NET 프레임 워크에는 TiffBitmapDecoder라는 멋진 래퍼가 있습니다.

+1

몇 개의 링크를 추가 할 수 있습니까? 내가 본 것에서 TiffBitmapDecoder는 한 번에 이미지를 메모리에로드하려고 시도합니다. 나는 그것을 할 수 없다. 그림> 1GByte는 조각화로 인해 32 비트 시스템에서 항상 실패합니다. windows7-specifics (http://msdn.microsoft.com/en-us/library/ee720061%28VS.85%29.aspx)를 언급하고 있습니까? – Adriaan

+0

아니요, 미정은 이미지를 저장하지 않습니다. 여기에서 시작하십시오 : http://msdn.microsoft.com/en-us/library/ms748873.aspx –

+0

도움 주셔서 감사합니다. 불행히도 내 경험이 다릅니다. http://msdn.microsoft.com/en-us/library/ms748873.aspx에서 설명하는 단계는 비트 맵의 ​​1 프레임 크기로 단일 메모리 블록을 할당하려고 시도합니다. 모든 픽셀에 대한 액세스가 필요합니다. 비트 맵 (화면에 메모리 저장 옵션이 없으므로)은 메모리의 한 덩어리에만 꼭 필요한 것은 아닙니다. 예제에서 주어진 것처럼 tiff 디코더를 실행하려고하면 비트 맵> 10k * 10k에서 일반적으로 실패합니다. 그리고 이것들은 단지 나의 '작은 테스트 파일'입니다. 내 타겟은 800 픽셀 x 16 비트입니다. 그것이 내가 타일 된 TIFF 파일을 찾는 이유입니다. – Adriaan

1

제 초기 솔루션은 LibTIFF DLL에 C# .NET 래퍼를 사용하는 것이 었습니다. 나는 libtiff ftp에 그것을 발견했다. 그것은 LIBTiff 라이브러리의 모든 중요한 메소드를 포함하는 것 같습니다. 관리되지 않는 LibTIFF 메모리에 메모리를 유지합니다. 이것은 C# 코드가 안전 코드로 처리되어야 할 때 이것을 인식하고 데이터를 복사해야한다는 것을 의미합니다.

내 '타일 읽는 코드'가

처럼 읽을 테스트
if (LibTIFF.IsTiled(tiff)) 
{ 
    if (LibTIFF.GetField(tiff, (int)TIFFTags.TIFFTAG_TILEWIDTH, out tileWidth) && 
     LibTIFF.GetField(tiff, (int)TIFFTags.TIFFTAG_TILELENGTH, out tileLength)) 
    { 
     uint tiles = 0; 
     IntPtr pTile = LibTIFF._malloc((int)(tileLength*tileWidth*bitsPerSample/2)); 
     for (uint y = 0; y < imageLength; y += tileLength) 
     { 
      for (uint x = 0; x < imageWidth; x += tileWidth) 
      { 
       LibTIFF.ReadTile(tiff, pTile, x, y, 0, 0); 
       tiles++; 
      } 
     }       
     LibTIFF._free(pTile); 
    } 
} 

그래도 난 LibTIFF의 .NET 포트에 갈거야,하지만이 솔루션은 다른 사람에 대한 올바른 하나가 될 수있다, 그래서 나는 떠나 그것 StackOverflow에.

+0

'LibTiff'만 Tiled TIFF를 처리 할 수 ​​있습니까? 또는 .NET Framework의 TiffBitmapDecoder 클래스를 사용하여 동일한 작업을 수행 할 수 있습니까? –

+0

내가 볼 수 있듯이, TiffBitMapDecoder는 파일의 일부를 선택적으로로드하는 기능을 제공하지 않습니다 (전체 프레임을 렌더링하는 경우에만 해당). http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.tiffbitmapdecoder(v=vs.110).aspx – Adriaan