문제

libtiff를 사용하여 매우 큰 TIFF 파일에 액세스하고 싶습니다. 여러 페이지 나 타일과 같은 기능이 필요하므로 Libtiff가 올바른 방법 인 것 같습니다. 누구든지 C#에서 libtiff를 사용하는 방법에 대해 저를 도울 수 있습니까? 몇 가지 링크를 찾았습니다 (예 : blog.bee-ee 부분 코드가 포함되어 있습니다. 그러나 나는 버전을 얻는 것을 넘어서지 않습니다. 나는 보았다 자유이지 그러나 적합하지 않음 (사진은 약 800 MPIXEL 8 또는 16 비트 그레이 스케일-> 800-1600 MBYTE) 크기이며 32 비트 환경에서 메모리에로드 할 수 없습니다).

나는 C/C ++에서 매우 경험이 많지만 아직 C#은 아닙니다. 누구든지 래퍼 나 힌트에 나를 도울 수 있습니까?

참고 : TIFF에서 피라미드 평면 (다중 해상도)에 액세스하고 256x256의 타일에 한 번에로드하지 않고 이미지의 다른 부분에 빠르게 액세스 할 수있는 페이지가 필요합니다.

편집 libtiff.net 해결책은 저에게 가장 실용적인 것처럼 보였습니다. 나는 지금 그것을 제품 개발에 통합하고 있으며, 관리가있는 메모리에 들어가거나 나오는 것을 막을 수있을 것입니다. 아직 '콜백'기능을 시도하지 않았습니다.. stackoverflow [/edit]에 대한 도움에 감사드립니다.

도움이 되었습니까?

해결책

libtiff.net을 사용해 볼 수 있습니다. Managed C#을 사용하여 작성된 Libtiff의 무료 및 오픈 소스 버전입니다. 우리의 구현의 API는 원본과 매우 유사하게 유지되었습니다.

http://bitmiracle.com/libtiff/

방금 릴리스되었으므로 버그가있을 수 있습니다. 그러나 전체 소스 코드에는 여러 가지 테스트가 제공되므로 가장 명백한 버그는 수정되어야합니다.

다른 팁

WIC는 매우 큰 이미지 파일을 지원합니다. .NET Framework : TiffbitmapDecoder에는 멋진 래퍼가 있습니다.

나의 초기 솔루션은 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);   
    }
}

그래도 .NET 포트의 libtiff 포트로 갈 것입니다. 그러나이 솔루션은 다른 사람들에게 맞는 솔루션 일 수 있으므로 stackoverflow에 남겨 둡니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top