Pregunta

Me gustaría usar LBTIFF para acceder a archivos TIFF muy grandes. Necesito funciones como múltiples páginas y azulejos, por lo que Libtiff parece ser el camino correcto. ¿Alguien puede ayudarme en cómo usar Libtiff de C#? He encontrado algunos enlaces (como blog.bee-ee que contenía código parcial. Pero no puedo ir más allá de obtener una versión. He mirado FreeImage pero se encontró que no es adecuado (las imágenes son de aproximadamente 800 mpíxeles de 8 o 16 bitscala 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 aún no en C#. ¿Alguien puede ayudarme a un envoltorio o algunas pistas?

Nota: Necesito páginas para acceder a planos piramidales (resolución múltiple) en un TIFF y los mosaicos de 256x256 para tener acceso rápido a diferentes partes de la imagen sin cargarla a la vez.

Editar] el Libtiff.net La solución me pareció más práctica para mí. Ahora lo estoy integrando en un desarrollo de productos, y propiamente tiempo me ahorrará muchos dolores de cabeza para entrar/salir de la memoria administrada. Todavía no he probado la funcionalidad de 'devolución de llamada', que parece estar bien resuelta de una manera .NET. Gracias por la ayuda en StackOverflow [/editar

¿Fue útil?

Solución

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 mantiene muy similar a la de One 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 se deben solucionar los errores más obvios.

Otros consejos

WIC proporciona soporte para archivos de imagen muy grandes. Hay un buen envoltorio para el marco .NET: TiffbitMapDecoder.

Mi solución inicial era usar un envoltorio C#.NET para el Libtiff DLL. Lo he encontrado en Libtiff FTP. Parece contener todos los métodos importantes de la Biblioteca Libtiff. Mantiene la memoria en la memoria de Libtiff sin administrar; Esto significa que el código C# debe conocer esto y copiar datos cuando debe procesarse en código seguro.

Mi 'código de lectura de mosaico' para probarlo 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, iré por el puerto .NET de Libtiff, pero esta solución puede ser la adecuada para otras personas, así que lo dejo en StackOverflow.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top