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.

1voto

In meinem Fall war der Pfad falsch

verwenden Sie einfach dies

String path = Server.MapPath("~/last_img.png");//Path

1voto

Ihab Punkte 2135

Mögliche Probleme, die einen solchen Fehler verursachen, sind:

  1. Verzeichnis existiert nicht (Die Methode, die Sie aufrufen, wird dieses Verzeichnis nicht automatisch für Sie erstellen)
  2. Die Sicherheitsberechtigungen zum Schreiben in das Ausgabeverzeichnis erlauben dem Benutzer, der die Anwendung ausführt, nicht das Schreiben

Ich hoffe, das hilft, das war die Lösung für mein Problem, ich habe einfach sichergestellt, dass das Ausgabeverzeichnis vor dem Speichern des Ausgabebildes existiert!

1voto

JAH Punkte 11

Wenn Sie versuchen, ein Bild in einem abgelegener Standort fügen Sie unbedingt die NETWORK_SERVICE Benutzerkonto in den Sicherheitseinstellungen einrichten und diesem Benutzer Lese- und Schreibrechte erteilen. Andernfalls wird es nicht funktionieren.

1voto

Bruno Ferreira Punkte 89

Ich erhalte diese Fehlermeldung auch, wenn ich versuche, Bilder unter demselben Namen zu speichern wie die zuvor gespeicherten Bilder.

Achten Sie darauf, dass Sie keine Bilder mit doppeltem Namen speichern.

Verwenden Sie dafür zum Beispiel eine 'Random'-Funktion ( Wie funktioniert der Zufallszahlengenerator von C#? ) oder zum Beispiel eine Guid erzeugen ( http://betterexplained.com/articles/the-quick-guide-to-guids/ )

0voto

AltF4_ Punkte 2120

Basierend auf der Antwort von @savindra , wenn Sie RHM auf Ihre Anwendung und versuchen Sie, sie als Verwalter dann sollte das Problem gelöst sein.

Bei mir schien es sich um ein Berechtigungsproblem zu handeln.

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