Uso de LibTiff desde C # (para acceder a imágenes TIFF en mosaico)

Me gustaría usar LibTiff para acceder a archivos TIFF muy grandes. Necesito funciones como varias páginas y mosaicos, por lo que LibTiff parece ser el camino correcto a seguir. ¿Alguien puede ayudarme a usar LibTiff desde C #? He encontrado algunos enlaces (como blog.bee-ee que contenía un código parcial. Pero no pude ir más allá de obtener una versión. He visto FreeImage pero no me pareció adecuado (las imágenes son aproximadamente de 800 MPixel 8 o 16). poco de escala de grises -> 800-1600 MByte) y no puedo cargarlo en la memoria en un entorno de 32 bits.

Tengo mucha experiencia en C / C ++, pero todavía no en C #. ¿Alguien puede ayudarme con un envoltorio o algunos consejos?

Nota: Necesito páginas para acceder a planos piramidales (multiresolución) en un tiff, y mosaicos de 256×256 para tener acceso rápido a diferentes partes de la imagen sin cargarlo de una vez.

[Editar] La solución LibTIFF.NET parecía más práctica para mí. Ahora lo estoy integrando en el desarrollo de un producto, y me ahorrará muchos dolores de cabeza por entrar y salir de la memoria administrada. Todavía no he probado la funcionalidad de “callback”, que parece estar resuelta de una manera .net. Gracias por la ayuda en stackoverflow [/ Edit]

Puedes probar nuestro LibTiff.Net. Es una versión gratuita y de código abierto de LibTiff escrita usando C # administrado. La API de nuestra implementación se mantuvo muy similar a la original.

http://bitmiracle.com/libtiff/

Acabamos de lanzarlo, por lo que puede haber errores. Pero el código fuente completo viene con una serie de pruebas, por lo que la mayoría de los errores obvios deben ser corregidos.

WIC proporciona soporte para archivos de imagen muy grandes. Hay una buena envoltura para él en .NET framework: TiffBitmapDecoder.

Mi solución inicial fue utilizar un contenedor C # .NET para la DLL LibTIFF. Lo he encontrado en libtiff ftp . Parece contener todos los métodos importantes de la biblioteca LIBTiff. Mantiene la memoria en la memoria LibTIFF no administrada; esto significa que el código C # debe ser consciente de esto y copiar los datos cuando es necesario procesarlos en un código seguro.

Mi ‘código de lectura de mosaico’ para probarlo se lee como

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); } } 

Sin embargo, buscaré el puerto .NET de LibTIFF, pero esta solución puede ser la correcta para otras personas, así que la dejo en StackOverflow.