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.
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.