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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top