Frage

Ich versuche, eine mehrseitige Farb-TIFF-Datei in eine C#-CompressionCCITT3-TIFF-Datei in C# zu konvertieren.Mir ist klar, dass ich sicherstellen muss, dass alle Pixel 1 Bit groß sind.Ich habe online kein brauchbares Beispiel dafür gefunden.

War es hilfreich?

Lösung

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

Sie benötigen diese Konvertierung, da CCITT3 und CCITT4 keine Farbe unterstützen (wenn ich mich recht erinnere).

Andere Tipps

Haftungsausschluss für Zuhälter:ich arbeite für Atalasoft, ein Unternehmen, das .NET-Bildbearbeitungssoftware herstellt.

Benutzen dotImage, diese Aufgabe sieht etwa so aus:

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);
    }
}

Das Bob-Powell-Beispiel ist soweit gut, hat aber eine Reihe von Problemen, nicht zuletzt die Verwendung eines einfachen Schwellenwerts, was großartig ist, wenn Sie Geschwindigkeit wollen und sich nicht wirklich um die Ausgabe kümmern aussieht oder Ihre Eingabedomäne so ist, dass sie eigentlich schon ziemlich schwarz und weiß ist – nur in Farbe dargestellt.Die Binärisierung ist ein heikles Problem.Wenn Ihre Aufgabe darin besteht, die verfügbaren Informationen um 1/24 zu reduzieren, ist es eine Herausforderung, die richtigen Informationen zu behalten und den Rest wegzuwerfen.DotImage verfügt über sechs verschiedene Tools (IIRC) zur Binarisierung.SimpleThreshold ist aus meiner Sicht der absolute Tiefpunkt.

Ich empfehle, zunächst mit TIFF- und Bilddienstprogrammen mit den gewünschten Ergebnissen zu experimentieren, bevor man sich mit der Codierung beschäftigt.ich fand VIPS ein praktisches Werkzeug sein.Die nächste Möglichkeit besteht darin, zu untersuchen, was LibTIFF leisten kann.Ich habe mit dem kostenlosen Programm gute Ergebnisse erzielt LibTiff.NET mit c# (siehe auch Paketüberfluss).Ich war von der GDI-TIFF-Funktionalität sehr enttäuscht, obwohl Ihr Kilometerstand variieren kann (ich benötige die fehlenden 16-Bit-Graustufen).Sie können auch die verwenden LibTiff Versorgungsunternehmen (d. h.sehen http://www.libtiff.org/man/tiffcp.1.html)

Ich habe den obigen Code gesehen und es sah so aus, als würde er jedes Pixel mit manueller Logik konvertieren.

Würde das für Sie funktionieren?

Importiert System.Drawing.Imaging

'Holen Sie sich die TIF-Farbdatei

Dim bmpColorTIF als neues Bitmap("C:\color.tif")

'Wählen Sie einen Bereich des TIF aus (erfasst alle Frames)

Dimmen Sie rectColorTIF als neues Rechteck (0, 0, bmpColorTIF.Width, bmpColorTIF.Height)

'Klonen Sie das Rechteck als 1-Bit-Farb-TIF

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

'Machen Sie mit der neuen Bitmap, was Sie wollen (speichern usw.)

...

Notiz:Es stehen unzählige Pixelformate zur Auswahl.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top