363 Stimmen

In GDI+, JPEG Image to MemoryStream ist ein allgemeiner Fehler aufgetreten

Dieser Fehler scheint im ganzen Web berüchtigt zu sein. So sehr, dass ich nicht in der Lage gewesen, eine Antwort auf mein Problem zu finden, da mein Szenario nicht passt. Eine Ausnahme wird ausgelöst, wenn ich das Bild in den Stream speichern.

Seltsamerweise funktioniert dies perfekt mit einem png, aber gibt den oben genannten Fehler mit jpg und gif, die ziemlich verwirrend ist.

Die meisten ähnlichen Probleme beziehen sich auf das Speichern von Bildern in Dateien ohne Berechtigungen. Ironischerweise ist die Lösung, einen Speicherstrom zu verwenden, wie ich es tue....

public static byte[] ConvertImageToByteArray(Image imageToConvert)
{
    using (var ms = new MemoryStream())
    {
        ImageFormat format;
        switch (imageToConvert.MimeType())
        {
            case "image/png":
                format = ImageFormat.Png;
                break;
            case "image/gif":
                format = ImageFormat.Gif;
                break;
            default:
                format = ImageFormat.Jpeg;
                break;
        }

        imageToConvert.Save(ms, format);
        return ms.ToArray();
    }
}

Mehr Details zur Ausnahme. Der Grund, warum dies so viele Probleme verursacht, ist das Fehlen einer Erklärung :(

System.Runtime.InteropServices.ExternalException was unhandled by user code
Message="A generic error occurred in GDI+."
Source="System.Drawing"
ErrorCode=-2147467259
StackTrace:
   at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters    encoderParams)
   at System.Drawing.Image.Save(Stream stream, ImageFormat format)
   at Caldoo.Infrastructure.PhotoEditor.ConvertImageToByteArray(Image imageToConvert) in C:\Users\Ian\SVN\Caldoo\Caldoo.Coordinator\PhotoEditor.cs:line 139
   at Caldoo.Web.Controllers.PictureController.Croppable() in C:\Users\Ian\SVN\Caldoo\Caldoo.Web\Controllers\PictureController.cs:line 132
   at lambda_method(ExecutionScope , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
 InnerException: 

OK Dinge, die ich bisher ausprobiert habe.

  1. Klonen Sie das Bild und arbeiten Sie daran.
  2. Abrufen des Kodierers für diese MIME-Datei, die mit der Qualitätseinstellung jpeg übergeben wird.

12voto

vipes Punkte 840

Dies ist eine Erweiterung/Einschränkung von Freds Antwort, in der es hieß: "GDI begrenzt die Höhe eines Bildes auf 65534". Wir sind bei einer unserer .NET-Anwendungen auf dieses Problem gestoßen, und nachdem wir den Beitrag gesehen hatten, hob unser Outsourcing-Team die Hände in die Luft und sagte, sie könnten das Problem nicht ohne größere Änderungen beheben.

Nach meinen Tests ist es möglich, Bilder mit einer Höhe von mehr als 65534 zu erstellen/zu bearbeiten, aber das Problem tritt beim Speichern in einem Stream oder einer Datei auf IN BESTIMMTEN FORMATEN . Im folgenden Code löst der Aufruf der Methode t.Save() bei mir eine generische Ausnahme aus, wenn die Pixelhöhe 65501 beträgt. Aus Neugierde wiederholte ich den Test für die Breite, und die gleiche Grenze galt für das Speichern.

    for (int i = 65498; i <= 100000; i++)
    {
        using (Bitmap t = new Bitmap(800, i))
        using (Graphics gBmp = Graphics.FromImage(t))
        {
            Color green = Color.FromArgb(0x40, 0, 0xff, 0);
            using (Brush greenBrush = new SolidBrush(green))
            {
                // draw a green rectangle to the bitmap in memory
                gBmp.FillRectangle(greenBrush, 0, 0, 799, i);
                if (File.Exists("c:\\temp\\i.jpg"))
                {
                    File.Delete("c:\\temp\\i.jpg");
                }
                t.Save("c:\\temp\\i.jpg", ImageFormat.Jpeg);
            }
        }
        GC.Collect();
    }

Der gleiche Fehler tritt auch auf, wenn Sie in einen Speicherstrom schreiben.

Um dies zu umgehen, können Sie den obigen Code wiederholen und ImageFormat.Tiff oder ImageFormat.Bmp durch ImageFormat.Jpeg ersetzen.

Bei mir geht das bis zu einer Höhe/Breite von 100.000 - die Grenzen habe ich nicht getestet. Zufälligerweise war Tiff eine praktikable Option für uns.

SEI GEWARNT

Die TIFF-Streams/Dateien im Speicher verbrauchen mehr Speicher als ihre JPG-Gegenstücke.

12voto

HU. Punkte 131

Ich hatte ein sehr ähnliches Problem und habe auch versucht, das Bild zu klonen, was nicht funktioniert hat. Ich fand heraus, dass die beste Lösung darin bestand, ein neues Bitmap-Objekt aus dem Bild zu erstellen, das aus dem Speicherstrom geladen wurde. Auf diese Weise kann der Stream z.B. entsorgt werden.

using (var m = new MemoryStream())
{
    var img = new Bitmap(Image.FromStream(m));
    return img;
}

Ich hoffe, das hilft.

6voto

Gaurang s Punkte 821

Der Fehler tritt wegen der Berechtigung auf. Stellen Sie sicher, dass der Ordner ALLE Berechtigungen hat.

public Image Base64ToImage(string base64String)
    {
        // Convert Base64 String to byte[]
        byte[] imageBytes = Convert.FromBase64String(base64String);
        MemoryStream ms = new MemoryStream(imageBytes, 0,
          imageBytes.Length);

        // Convert byte[] to Image
        ms.Write(imageBytes, 0, imageBytes.Length);
        Image image = Image.FromStream(ms, true);
        return image;
    }

 img.Save("YOUR PATH TO SAVE IMAGE")

5voto

Marco Punkte 51

GELÖST - Ich hatte genau dieses Problem. Die Lösung bestand für mich darin, die Festplattenquote für IUSR auf dem IIS-Server zu erhöhen. In diesem Fall haben wir eine Kataloganwendung mit Bildern von Artikeln und dergleichen. Die Upload-Quote für den "Anonymen Web-Benutzer" war auf 100 MB festgelegt, was die Standardeinstellung für die IIS-Server dieses Hosting-Unternehmens ist. Ich habe es auf 400 MB erhöht und konnte die Bilder ohne Fehler hochladen.

Das ist vielleicht nicht Ihr Problem, aber wenn doch, ist es leicht zu beheben.

5voto

Ani Punkte 2626

In meinem Fall lag das Problem in dem Pfad, den ich speicherte (die Root C:\ ). Ändern Sie es in D:\111\ hat die Ausnahme beseitigt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X