webentwicklung-frage-antwort-db.com.de

In GDI + in der Bitmap.Save-Methode ist ein generischer Fehler aufgetreten

Ich arbeite gerade an dem Hochladen und Speichern einer Miniaturansicht dieses Bildes in einem Miniaturordner.

Ich verwende folgenden Link:

http://weblogs.asp.net/markmcdonnell/archive/2008/03/09/resize-image-before-uploading-to-server.aspx

aber 

newBMP.Save(directory + "tn_" + filename);   

verursacht die Ausnahme "Ein generischer Fehler ist in GDI + aufgetreten."

Ich habe versucht, die Erlaubnis für den Ordner zu erteilen, ich habe auch versucht, beim Speichern ein neues separates BMP-Objekt zu verwenden.

Bearbeiten: 

    protected void ResizeAndSave(PropBannerImage objPropBannerImage)
    {
        // Create a bitmap of the content of the fileUpload control in memory
        Bitmap originalBMP = new Bitmap(fuImage.FileContent);

        // Calculate the new image dimensions
        int origWidth = originalBMP.Width;
        int origHeight = originalBMP.Height;
        int sngRatio = origWidth / origHeight;
        int thumbWidth = 100;
        int thumbHeight = thumbWidth / sngRatio;

        int bannerWidth = 100;
        int bannerHeight = bannerWidth / sngRatio;

        // Create a new bitmap which will hold the previous resized bitmap
        Bitmap thumbBMP = new Bitmap(originalBMP, thumbWidth, thumbHeight);
        Bitmap bannerBMP = new Bitmap(originalBMP, bannerWidth, bannerHeight);

        // Create a graphic based on the new bitmap
        Graphics oGraphics = Graphics.FromImage(thumbBMP);
        // Set the properties for the new graphic file
        oGraphics.SmoothingMode = SmoothingMode.AntiAlias; oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;

        // Draw the new graphic based on the resized bitmap
        oGraphics.DrawImage(originalBMP, 0, 0, thumbWidth, thumbHeight);

        Bitmap newBitmap = new Bitmap(thumbBMP);
        thumbBMP.Dispose();
        thumbBMP = null;

        // Save the new graphic file to the server
        newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);

        oGraphics = Graphics.FromImage(bannerBMP);
        // Set the properties for the new graphic file
        oGraphics.SmoothingMode = SmoothingMode.AntiAlias; oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;

        // Draw the new graphic based on the resized bitmap
        oGraphics.DrawImage(originalBMP, 0, 0, bannerWidth, bannerHeight);
        // Save the new graphic file to the server
        bannerBMP.Save("~/image/" + objPropBannerImage.ImageId + ".jpg");


        // Once finished with the bitmap objects, we deallocate them.
        originalBMP.Dispose();

        bannerBMP.Dispose();
        oGraphics.Dispose();
    }
47
donstack

Wenn entweder ein Bitmap-Objekt oder ein Image-Objekt aus einem .__ erstellt wird. Datei bleibt die Datei für die Lebensdauer des Objekts gesperrt. Als ein Daher können Sie ein Bild nicht ändern und es in derselben Datei speichern. wo es entstanden ist . http://support.Microsoft.com/?id=814675

Ein generischer Fehler ist in GDI +, JPEG-Bild in MemoryStream aufgetreten.

Image.Save (..) löst eine GDI + -Ausnahme aus, da der Speicherstrom geschlossen ist

http://alperguc.blogspot.in/2008/11/c-generic-error-occurred-in-gdi.html

EDIT:
nur aus dem Gedächtnis schreiben ... 

speichern Sie in einem "intermediären" Speicher-Stream, der funktionieren sollte

z.B. versuchen Sie es mit diesem - ersetzen 

    Bitmap newBitmap = new Bitmap(thumbBMP);
    thumbBMP.Dispose();
    thumbBMP = null;
    newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);

mit so etwas wie: 

string outputFileName = "...";
using (MemoryStream memory = new MemoryStream())
{
    using (FileStream fs = new FileStream(outputFileName, FileMode.Create, FileAccess.ReadWrite))
    {
        thumbBMP.Save(memory, ImageFormat.Jpeg);
        byte[] bytes = memory.ToArray();
        fs.Write(bytes, 0, bytes.Length);
    }
}
78
NSGaga

Diese Fehlermeldung wird auch angezeigt, wenn der Pfad, den Sie an Bitmap.Save() übergeben, ungültig ist (Ordner existiert nicht usw.).

34
Reg Edit
    // Once finished with the bitmap objects, we deallocate them.
    originalBMP.Dispose();

    bannerBMP.Dispose();
    oGraphics.Dispose();

Dies ist ein Programmierstil, den Sie früher oder später bereuen werden. Früher klopft es an der Tür, Sie haben eine vergessen. Sie verfügen nicht über newBitmap. Dadurch bleibt die Datei gesperrt, bis der Speicherbereiniger ausgeführt wird. Wenn dies nicht der Fall ist, erhalten Sie beim zweiten Versuch, in derselben Datei zu speichern, den Klaboom. GDI + -Ausnahmen sind zu miserabel, um eine gute Diagnose zu geben, sodass ernsthaftes Kopfkratzen entsteht. Über die Tausenden von googlable Posts hinaus, die diesen Fehler erwähnen.

Immer favor mit der Anweisung mit der Anweisung. Das vergisst nie, ein Objekt zu entsorgen, selbst wenn der Code eine Ausnahme auslöst. 

using (var newBitmap = new Bitmap(thumbBMP)) {
    newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);
}

Obwohl es sehr unklar ist, warum Sie überhaupt eine neue Bitmap erstellen, sollte das Speichern von thumbBMP bereits gut genug sein. Wie auch immer, geben Sie dem Rest Ihrer Einwegobjekte dasselbe mit Liebe.

9
Hans Passant

Überprüfen Sie die Berechtigung Ihres Ordners, in dem das Bild gespeichert ist Klicken Sie mit der rechten Maustaste auf den Ordner, und gehen Sie folgendermaßen vor:

Eigenschaften> Sicherheit> Bearbeiten> Hinzufügen - Wählen Sie "Alle" aus und aktivieren Sie "Vollzugriff zulassen".

6
Asad

Ich hatte das gleiche Problem Bei GDI + ist ein allgemeiner Fehler aufgetreten Beim Speichern während der Arbeit an der MVC-App trat dieser Fehler auf, weil ich einen falschen Pfad zum Speichern des Bildes schrieb. Ich korrigierter Speicherpfad) und es hat gut funktioniert für mich.

img1.Save(Server.MapPath("/Upload/test.png", System.Drawing.Imaging.ImageFormat.Png);


--Above code need one change, as you need to put close brackets on Server.MapPath() method after writing its param.

So was-

img1.Save(Server.MapPath("/Upload/test.png"), System.Drawing.Imaging.ImageFormat.Png);
5
Anjan Kant

In meinem Fall war die Bitmap-Bilddatei bereits im Systemlaufwerk vorhanden , daher hat meine App den Fehler/geworfen "Ein generischer Fehler ist in GDI +" aufgetreten.

  1. Stellen Sie sicher, dass der Zielordner vorhanden ist
  2. Stellen Sie sicher, dass sich im Zielordner noch keine Datei mit demselben Namen befindet
5
Palani Kumar

Ich habe es mit FileStream zum Laufen gebracht
http://alperguc.blogspot.in/2008/11/c-generic-error-occurred-in-gdi.htmlhttp://csharpdotnetfreak.blogspot.com/2010 /02/resize-image-upload-ms-sql-database.html

System.Drawing.Image imageToBeResized = System.Drawing.Image.FromStream(fuImage.PostedFile.InputStream);
        int imageHeight = imageToBeResized.Height;
        int imageWidth = imageToBeResized.Width;
        int maxHeight = 240;
        int maxWidth = 320;
        imageHeight = (imageHeight * maxWidth) / imageWidth;
        imageWidth = maxWidth;

        if (imageHeight > maxHeight)
        {
            imageWidth = (imageWidth * maxHeight) / imageHeight;
            imageHeight = maxHeight;
        }

        Bitmap bitmap = new Bitmap(imageToBeResized, imageWidth, imageHeight);
        System.IO.MemoryStream stream = new MemoryStream();
        bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
        stream.Position = 0;
        byte[] image = new byte[stream.Length + 1];
        stream.Read(image, 0, image.Length);
        System.IO.FileStream fs
= new System.IO.FileStream(Server.MapPath("~/image/a.jpg"), System.IO.FileMode.Create
, System.IO.FileAccess.ReadWrite);
            fs.Write(image, 0, image.Length);
1
donstack

Ich überprüfe/teste immer diese:

  • Enthält der Pfad + Dateiname ungültige Zeichen für das angegebene Dateisystem?
  • Existiert die Datei bereits? (Schlecht)
  • Existiert der Pfad schon? (Gut)
  • Wenn der Pfad relativ ist: erwarte ich ihn im richtigen übergeordneten Verzeichnis (meistens bin/Debug ;-))?
  • Ist der Pfad für das Programm schreibbar und als welcher Benutzer läuft es? (Dienstleistungen können hier schwierig sein!)
  • Enthält der vollständige Pfad wirklich keine illegalen Zeichen? (einige Unicode-Zeichen sind nahezu unsichtbar)

Abgesehen von dieser Liste hatte ich nie Probleme mit Bitmap.Save().

1

Ich hatte ein anderes Problem mit derselben Ausnahme.

Zusamenfassend:

Stellen Sie sicher, dass das Objekt BitmapStream nicht gelöscht wird, bevor Sie .Save aufrufen.

Ganze Geschichte:

Es gab eine Methode, die ein Bitmap-Objekt zurückgab, das auf folgende Weise aus einer MemoryStream erstellt wurde:

private Bitmap getImage(byte[] imageBinaryData){
    .
    .
    .
    Bitmap image;
    using (var stream = new MemoryStream(imageBinaryData))
    {
        image = new Bitmap(stream);
    }
    return image;
}

dann hat jemand das zurückgegebene Bild verwendet, um es als Datei zu speichern

image.Save(path);

Das Problem bestand darin, dass der ursprüngliche Stream bereits beim Versuch, das Bild zu speichern, gelöscht wurde und die GDI + -Exception ausgelöst wurde.

Zur Behebung dieses Problems wurde die Bitmap zurückgegeben, ohne den Stream selbst, sondern das zurückgegebene Bitmap-Objekt zu entsorgen.

private Bitmap getImage(byte[] imageBinaryData){
   .
   .
   .
   Bitmap image;
   var stream = new MemoryStream(imageBinaryData))
   image = new Bitmap(stream);

   return image;
}

dann:

using (var image = getImage(binData))
{
   image.Save(path);
}
0
Yan

Legen Sie den Ordnerpfad image/thumbs auf Ihrer Festplatte an => Problem gelöst!

0
Chưa biết

Dieser Fehler ist beim Versuch aufgetreten, Tiff-Bilder in JPEG zu konvertieren. Für mich bestand das Problem darin, dass die TIFF-Abmessungen zu groß waren. Alles, was bis zu 62000 Pixel betrug, war in Ordnung, alles oberhalb dieser Größe verursachte den Fehler. 

0
RichTea88
    I used below logic while saving a .png format. This is to ensure the file is already existing or not.. if exist then saving it by adding 1 in the filename

Bitmap btImage = new Bitmap("D:\\Oldfoldername\\filename.png");
    string path="D:\\Newfoldername\\filename.png";
            int Count=0;
                if (System.IO.File.Exists(path))
                {
                    do
                    {
                        path = "D:\\Newfoldername\\filename"+"_"+ ++Count + ".png";                    
                    } while (System.IO.File.Exists(path));
                }

                btImage.Save(path, System.Drawing.Imaging.ImageFormat.Png);
0

Für mich war es ein Erlaubnisproblem. Jemand hat Schreibberechtigungen für den Ordner für das Benutzerkonto entfernt, unter dem die Anwendung ausgeführt wurde.

0
Jenny O'Reilly

von msdn: public void Save (string filename);, was für mich ziemlich überraschend ist, da wir nicht nur den Dateinamen übergeben müssen, sondern den Dateinamen zusammen mit dem Pfad, zum Beispiel: MyDirectory/MyImage.jpeg, hier existiert MyImage.jpeg noch nicht, aber unsere Datei wird gespeichert mit diesem Namen.

Ein weiterer wichtiger Punkt ist, dass Sie bei Verwendung von Save() in einer Webanwendung Server.MapPath() zusammen mit dieser verwenden, die im Grunde nur den physischen Pfad für den übergebenen virtuellen Pfad zurückgibt. Beispiel: image.Save(Server.MapPath("~/images/im111.jpeg"));

0

für mich war es ein Pfadproblem beim Speichern des Bildes.

int count = Directory.EnumerateFiles(System.Web.HttpContext.Current.Server.MapPath("~/images/savedimages"), "*").Count();

var img = Base64ToImage(imgRaw);

string path = "images/savedimages/upImages" + (count + 1) + ".png";

img.Save(Path.Combine(System.Web.HttpContext.Current.Server.MapPath(path)));

return path;

Also habe ich den folgenden Schrägstrich hinzugefügt

String path = "images/savedimages....

sollte sein

String path = "/images/savedimages....

Hoffe, das hilft jedem, festzuhalten!

0
imBlue