Frage

Ich habe eine Anwendung, die einem Benutzer ermöglicht, einen Bereich eines Bildes zu definieren und diesen Bereich zu Datei speichern. Ich habe gegen einen Haken laufen, dass ich nicht in Ordnung bringen kann. Die Bitmap, dass ich erstelle die ausgewählte Region malen auf mit einem Imageformat von „MemoryBmp“ hängt geblieben ist, scheint es, dass dies das Imageformat ist, das für jede nicht-Datei festgelegt wird Bitmaps geladen. Das Problem ist meine Bitmap im Speicher erzeugt wird, und ich möchte es als CCITT4 bitonale TIFF speichern, aber ich bin immer eine Ausnahme „Ein allgemeiner Fehler in GDI + aufgetreten“. Ich bin mir ziemlich sicher, dass dies aufgrund der Tatsache, ist die Image.RawFormat Eigenschaft, dass MemoryBmp gefürchtet wird.

Image.Save () eine Überlastung, die ein Imageformat-Parameter annimmt und wenn ich, dass ImageFormat.Tiff vorbei es in Ordnung spart, aber ich habe nicht die Möglichkeit, meine Kodier-Parameter angeben.

Die einzig mögliche Abhilfe, die ich denken kann, ist auf der Festplatte zu speichern, mit Image.Save (Bild, Imageformat) es dann neu zu laden (RawFormat wird nun korrekt auf ImageFormat.Tif eingestellt wird) und dann wieder speichern Sie die Encoder-Einstellungen übergeben. Das ist einfach nur dumm aber es muss ein besserer Weg geben.

Hier ist ein Code snipped ist (dies ist nur Sachen zu testen), die Sie sollten eine Vorstellung davon, was ich bei meiner früheren Beschreibung tut nicht klar genug war:

SizeF dpiScale = GetScreenToImageDPIRatio(loadedImage);
using (Bitmap image = new Bitmap(loadedImage,
    (int)(_cropBox.Width * dpiScale.Width),
    (int)(_cropBox.Height * dpiScale.Height)))
{
    image.SetResolution(loadedImage.HorizontalResolution, 
        loadedImage.VerticalResolution);

    using (Graphics g = Graphics.FromImage(image))
    {
        g.DrawImage(loadedImage, 0, 0, new Rectangle(
            (int)(_cropBox.Location.X * dpiScale.Width),
            (int)(_cropBox.Location.Y * dpiScale.Height),
            (int)(_cropBox.Width * dpiScale.Width),
            (int)(_cropBox.Height * dpiScale.Height)),
            GraphicsUnit.Pixel);
    }

    //  It's stuck as a MemoryBmp so none of these checks will work
    if (true || image.RawFormat.Equals(ImageFormat.Tiff))
    {
        ImageCodecInfo tiffCodecInfo = ImageUtils.GetEncoderInfo("image/tiff");
        EncoderParameters myEncoderParameters = new EncoderParameters(2);

        myEncoderParameters.Param[0] = new
            EncoderParameter(System.Drawing.Imaging.Encoder.Compression,
                (long)EncoderValue.CompressionCCITT4);
        myEncoderParameters.Param[1] = new
            EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 1L);

        image.Save(Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + ".tif"),
            tiffCodecInfo, myEncoderParameters);

        //  The file is a "MemoryBmp" and it's screwing things up
        //image.Save(Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + ".tif"),
        //    ImageFormat.Tiff);
    }
    else
    {
        //  other format saving support, blah blah blah
    }
}

Oh, ich soll erwähnen, dass „loadedIimage“ ist in der Tat ein TIFF-Bild, legte ich den Verweis auf loadedImage zum Bitmap.ctor (), um zu sehen, ob der Anhaltspunkt wäre es in dem, was es mit zu tun hat, aber es machte keinen Unterschied.

War es hilfreich?

Lösung

herausgefunden, dass CCITT4 erfordert bitonale Bilder, ha! Also ging ich aus googeln und kam über einen Codeproject Artikel und geschnüffelt um in die Quelle. Der Autor selbst ein recht ordentliches Verfahren 32bppARGB zu konvertieren Zweitonbild 1bpp. Ich versuchte es und es ist schnell (Test zeigt rund 34 ms für eine einzelne Seite), und es hat den Trick!

Ich bin meine eigene Frage zu beantworten. Ich hoffe, das hilft zumindest jemanden, der über dieses Problem kommt.

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