Domanda
Sto cercando di convertire un file tiff a colori multipagina in un tiff C# CompressionCCITT3 in C#.Mi rendo conto che devo assicurarmi che tutti i pixel siano 1 bit.Non ho trovato un esempio utile di questo online.
Soluzione
Guardare: http://bobpowell.net/onebit.htm
Hai bisogno di questa conversione poiché CCITT3 e CCITT4 non supportano il colore (se ricordo bene).
Altri suggerimenti
Dichiarazione di non responsabilità sullo sfruttamento della prostituzione:lavoro per Atalasoft, un'azienda che produce software di imaging .NET.
Utilizzando puntoImage, questa attività diventa qualcosa del genere:
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);
}
}
L'esempio di Bob Powell è buono, per quanto va, ma presenta una serie di problemi, non ultimo il fatto che utilizza una soglia semplice, il che è fantastico se vuoi velocità e non ti interessa effettivamente quale sia il tuo output assomiglia o il tuo dominio di input è tale che in realtà è già praticamente in bianco e nero, semplicemente rappresentato a colori.La binarizzazione è un problema complicato.Quando il tuo compito è ridurre le informazioni disponibili di 1/24, come conservare le informazioni giuste e buttare via il resto è una sfida.DotImage ha sei diversi strumenti (IIRC) per la binarizzazione.SimpleThreshold è il fondo del barile, dal mio punto di vista.
Suggerisco di sperimentare prima i risultati desiderati utilizzando le utilità tiff e immagini prima di immergersi nella codifica.ho trovato VIP essere uno strumento utile.L'opzione successiva è esaminare cosa può fare LibTIFF.Ho avuto buoni risultati con il free LibTiff.NET utilizzando c# (vedi anche stackoverflow).Sono rimasto molto deluso dalla funzionalità tiff GDI, anche se il tuo chilometraggio può variare (ho bisogno della scala di grigi a 16 bit mancante).Inoltre è possibile utilizzare il file LibTiff utilità (es.Vedere http://www.libtiff.org/man/tiffcp.1.html)
Ho visto il codice sopra e sembrava che stesse convertendo ogni pixel con la logica manuale.
Funzionerebbe per te?
Importa System.Drawing.Imaging
prendi il file tif a colori
Dim bmpColorTIF come nuova bitmap("C:\color.tif")
'seleziona un'area del tif (prenderà tutti i fotogrammi)
Dim rectColorTIF Come nuovo rettangolo(0, 0, bmpColorTIF.Width, bmpColorTIF.Height )
'clona il rettangolo come tif a colori a 1 bit
Dim bmpBlackWhiteTIF come bitmap = bmpColorTIF.Clone(rectColorTIF, PixelFormat.Format1bppIndexed)
'fai quello che vuoi con la nuova bitmap (salva, ecc.)
...
Nota:ci sono un sacco di formati pixel tra cui scegliere.