2009-12-03 2 views
1

데이터베이스의 많은 이미지를 byte []로 저장하는 시스템에서 작업하고 있습니다. 각 바이트 []는 이미 멀티 페이지 티프이지만, 이미지를 검색하여 하나의 멀티 페이지 티프로 변환해야합니다. 시스템은 이전에 Save 및 SaveAdd와 함께 System.Drawing.Image 클래스를 사용하고있었습니다. 파일을 점진적으로 저장한다는 점에서 멋 졌으므로 메모리 사용량은 최소화되었지만 GDI + 동시성 문제가 발생했습니다. 이는 백엔드에서 실행 중입니다. COM +에서.다중 byte []를 GDI없이 Image.SaveAdd의 multipage tiff로 변환

메서드가 System.Windows.Media.Imaging 클래스 인 TiffBitmapDecoder와 TiffBitmapEncoder를 사용하여 중간에 약간의 마사지를 사용하도록 변환되었습니다. 이것은 동시성 문제를 해결했지만 메모리 사용을 제한하기 위해 점진적으로 이미지를 저장하는 방법을 찾기 위해 고심하고 있습니다. 따라서 조작 할 수있는 이미지의 크기가 훨씬 더 작습니다 (즉, 테스트 1.2를 만들었습니다). GB 이미지를 GDI + 클래스를 사용하고, 계속 진행할 수 있었지만 다른 방법을 사용하여 ~ 600MB 파일 만 만들 수있었습니다).

메모리 문제를 피하기 위해 점진적으로 다중 페이지 티프 이미지를 저장할 방법이 있습니까? TiffBitmapEncoder에서 Save가 두 번 이상 호출되면 오류가 발생합니다.

답변

1

나는 표준 .NET 방식을 사용하여 tiff 이미지를 디코딩하고 점진적으로 디스크에 기록 할 수있는 자체 tiff 인코더를 작성한다고 생각합니다. tiff 형식 사양은 공개됩니다.

tiff 디코딩은 쉽지 않습니다. 그래서 TiffBitmapDecoder를 사용합니다. 인코딩이 더 쉽기 때문에 별도의 프레임으로 피드 할 수 있고 필요한 데이터를 점진적으로 디스크에 쓰는 인코더를 작성할 수 있다고 생각합니다. IFD (이미지 파일 디렉토리) 항목을 업데이트 할 준비가되면 아마도 결과로 나타나는 tiff의 헤더를 업데이트해야 할 것입니다.

행운을 빈다.

+0

나는 Corne에 동의합니다. 그러나 고성능 범용 상용 라이브러리를 찾고 있다면 .NET과 C++ 버전 인 LeadTools를 높은 수준으로 사용했습니다. 닷넷 라이브러리는 이해하기 쉽습니다. C++ 라이브러리는 그렇게 쉬운 것은 아닙니다. –

1

저는 LibTIFF.NET을 통해이 작업을 수행했습니다. 이러한 방식으로 고통없이 멀티 기가 바이트 이미지를 처리 ​​할 수 ​​있습니다. 나는 타일 액세스를 위해 그것을 사용하지만

Using LibTIFF from c# to access tiled tiff images

에 내 질문을 참조, 메모리 문제와 유사하다. LibTIFF는 모든 TIFF 기능에 대한 완전한 액세스를 허용하므로 파일을 디렉토리와 같은 방식으로 읽고 저장할 수 있습니다.

주목할 가치가있는 다른 점은 다른 Windows 버전의 GDI 차이점입니다. GDI .NET exceptions을 참조하십시오.

관련 문제