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.

5voto

Hassan Rahman Punkte 4337

Einfach eine neue Instanz von Bitmap erstellen, um das Problem zu lösen.

string imagePath = Path.Combine(Environment.CurrentDirectory, $"Bhatti{i}.png");
Bitmap bitmap = new Bitmap(image);
bitmap.Save(imagePath);

4voto

Andy Punkte 404

Ich bin dran!

using (System.Drawing.Image img = Bitmap.FromFile(fileName))
{
      ... do some manipulation of img ...
      img.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
}

Ich habe es bei .Save..., weil using() die Datei offen hält, so dass ich sie nicht überschreiben kann. Vielleicht hilft das jemandem in der Zukunft.

4voto

Jaimin Punkte 171

Das gleiche Problem hatte ich auch. Aber in meinem Fall habe ich versucht, die Datei auf Laufwerk C zu speichern, und es war nicht zugänglich. Also habe ich versucht, die Datei auf dem Laufwerk D zu speichern, das voll zugänglich war, und das ist mir gelungen.

Überprüfen Sie also zunächst die Ordner, in denen Sie zu speichern versuchen. Sie müssen über alle Rechte (Lese- und Schreibrechte) für den jeweiligen Ordner verfügen.

4voto

MytyMyky Punkte 608

Eine andere Ursache für diesen Fehler - der Pfad, den Sie in der Save-Methode der Bitmap-Instanz angeben, existiert nicht oder Sie haben keinen vollständigen / gültigen Pfad angegeben.

Ich hatte gerade diesen Fehler, weil ich einen Dateinamen und nicht den vollständigen Pfad angegeben habe!

Das kommt vor!

2voto

ChrisF Punkte 130622

Ich stelle fest, dass Ihr "jpeg"-Fall tatsächlich so ist:

            default:
                format = ImageFormat.Jpeg;
                break;

Sind Sie sicher, dass das Format jpeg und nicht ein anderes ist?

Ich würde es versuchen:

            case "image/jpg": // or "image/jpeg" !
                format = ImageFormat.Jpeg;
                break;

Oder prüfen Sie, was imageToConvert.MimeType() tatsächlich zurückkehrt.

UPDATE

Müssen Sie das MemoryStream-Objekt auf andere Weise initialisieren?

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