Pergunta

Estou tentando converter um arquivo tiff colorido de várias páginas em um tiff c# CompressionCCITT3 em C#.Sei que preciso ter certeza de que todos os pixels têm 1 bit.Não encontrei um exemplo útil disso online.

Foi útil?

Solução

Confira: http://bobpowell.net/onebit.htm

Você precisa dessa conversão porque CCITT3 e CCITT4 não suportam cores (se bem me lembro).

Outras dicas

Isenção de responsabilidade de proxenetismo:eu trabalho para Atalasoft, uma empresa que fabrica software de imagem .NET.

Usando pontoImage, esta tarefa se torna algo assim:

FileSystemImageSource source = new FileSystemImageSource("path-to-your-file.tif", true); // true = loop over all frames
// tiff encoder will auto-select an appropriate compression - CCITT4 for 1 bit.
TiffEncoder encoder = new TiffEncoder();
encoder.Append = true;

// DynamicThresholdCommand is very good for documents.  For pictures, use DitherCommand
DynamicThresholdCommand threshold = new DynamicThresholdCommand();

using (FileStream outstm = new FileStream("path-to-output.tif", FileMode.Create)) {
    while (source.HasMoreImages()) {
        AtalaImage image = source.AcquireNext();
        AtalaImage finalImage = image;
        // convert when needed.
        if (image.PixelFormat != PixelFormat.Pixel1bppIndexed) {
            finalImage = threshold.Apply().Image;
        }
        encoder.Save(outstm, finalImage, null);
        if (finalImage != image) {
            finalImage.Dispose();
        }
        source.Release(image);
    }
}

O exemplo de Bob Powell é bom, até certo ponto, mas tem vários problemas, e o menos importante deles é que ele está usando um limite simples, o que é ótimo se você deseja velocidade e não se importa com qual será sua saída parece ou seu domínio de entrada é tal que já é praticamente preto e branco - apenas representado em cores.A binarização é um problema complicado.Quando sua tarefa é reduzir as informações disponíveis em 1/24, como manter as informações corretas e descartar o resto é um desafio.DotImage possui seis ferramentas diferentes (IIRC) para binarização.SimpleThreshold é o fundo do poço, do meu ponto de vista.

Sugiro experimentar primeiro os resultados desejados usando utilitários tiff e de imagem antes de mergulhar na codificação.eu encontrei VIPS para ser uma ferramenta útil.A próxima opção é ver o que o LibTIFF pode fazer.Tive bons resultados com o free LibTiff.NET usando c# (veja também fluxo de pilha).Fiquei muito decepcionado com a funcionalidade tiff do GDI, embora sua milhagem possa variar (preciso da escala de cinza de 16 bits que falta).Além disso, você pode usar o LibTiff utilitários (ou seja,ver http://www.libtiff.org/man/tiffcp.1.html)

Eu vi o código acima e parecia que ele estava convertendo cada pixel com lógica manual.

Isso funcionaria para você?

Importa Sistema.Drawing.Imaging

'obtém o arquivo tif colorido

Dim bmpColorTIF como novo bitmap("C:\color.tif")

'seleciona uma área do tif (irá capturar todos os frames)

Dim rectColorTIF como novo retângulo (0, 0, bmpColorTIF.Width, bmpColorTIF.Height )

'clona o retângulo como tif colorido de 1 bit

Dim bmpBlackWhiteTIF As Bitmap = bmpColorTIF.Clone(rectColorTIF, PixelFormat.Format1bppIndexed)

'faça o que quiser com o novo bitmap (salvar, etc)

...

Observação:há vários formatos de pixel para você escolher.

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