Usando a Libtiff de C# (para acessar imagens TIFF de azulejos)
-
19-09-2019 - |
Pergunta
Eu gostaria de usar a LBTIFF para acessar arquivos TIFF muito grandes. Preciso de funções como várias páginas e azulejos, e, portanto, a Libtiff parece ser o caminho certo a seguir. Alguém pode me ajudar sobre como usar a Libtiff de C#? Eu encontrei alguns links (como blog.bee-ee que continham código parcial. Mas eu não vou além de obter uma versão. Eu olhei FreeImage mas achei que não é adequado (as imagens são de aproximadamente 800 mpixel 8 ou 16 bits em escala de cinza-> 800-1600 mbyte) e não consigo carregá-lo na memória em um ambiente de 32 bits)
Tenho muita experiência em C/C ++, mas ainda não em C#. Alguém pode me ajudar a um invólucro ou algumas dicas?
NOTA: Preciso de páginas para acessar planos piramídicos (multi-resolução) em um TIFF e ladrilhos de 256x256 para ter acesso rápido a diferentes partes da imagem sem carregá-la de uma só vez.
Editar] o Libtiff.net A solução parecia mais prática para mim. Agora estou integrando -o no desenvolvimento de um produto e isso me economizará providamente muitas dores de cabeça de entrar/sair da memória gerenciada. Ainda não experimentei a funcionalidade de 'retorno de chamada', que parece ser resolvida bem de uma maneira .NET. Obrigado pela ajuda no Stackoverflow [/edit
Solução
Você pode experimentar o nosso libtiff.net. É uma versão gratuita e de código aberto do LIBTIFF escrito usando C#gerenciado. API de nossa implementação mantida muito semelhante à do original.
http://bitmiracle.com/libtiff/
Acabamos de lançar, então pode haver bugs. Mas o código -fonte completo vem com vários testes, portanto, a maioria dos bugs óbvios deve ser corrigida.
Outras dicas
O WIC fornece suporte para arquivos de imagem muito grandes. Há um bom invólucro na estrutura .NET: TiffbitmapDecoder.
Minha solução inicial foi usar um invólucro C#.NET para a DLL da Libtiff. Eu encontrei Libtiff ftp. Parece conter todos os métodos importantes da Biblioteca Libtiff. Mantém a memória na memória não gerenciada da Libtiff; Isso significa que o código C# precisa estar ciente disso e copiar dados quando precisar ser processado no código seguro.
Meu 'código de leitura de ladrilhos' para testá -lo como lido 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);
}
}
Porém, vou para a porta .NET da Libtiff, mas essa solução pode ser a correta para outras pessoas, então deixo no Stackoverflow.