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.

2voto

Khalil Liraqui Punkte 363

Eine andere Ursache für diesen Fehler und die Lösung für mein Problem ist, dass Ihre Anwendung keine Schreibberechtigung für ein Verzeichnis hat.

um die Antwort von savindra zu vervollständigen: https://stackoverflow.com/a/7426516/6444829 .

So gewähren Sie Dateizugriff auf IIS_IUSERS

Um den Zugriff auf eine ASP.NET-Anwendung zu ermöglichen, müssen Sie den Zugriff auf die IIs_IUSERS gewähren.

So gewähren Sie Lese-, Schreib- und Änderungsberechtigungen für eine bestimmte Datei oder einen bestimmten Ordner

  1. Suchen Sie im Windows Explorer die gewünschte Datei und wählen Sie sie aus.

  2. Klicken Sie mit der rechten Maustaste auf die Datei, und klicken Sie dann auf Eigenschaften.

  3. Klicken Sie im Dialogfeld Eigenschaften auf die Registerkarte Sicherheit.

  4. Überprüfen Sie auf der Registerkarte Sicherheit die Liste der Benutzer. (Wenn Ihre Anwendung als Netzwerkdienst ausgeführt wird, fügen Sie das Netzwerkdienstkonto in die Liste ein und erteilen ihm die Berechtigung.

  5. Klicken Sie im Dialogfeld Eigenschaften auf IIs_IUSERS, und wählen Sie im Abschnitt Berechtigungen für NETWORK SERVICE die Berechtigungen Lesen, Schreiben und Ändern.

  6. Klicken Sie auf Übernehmen und dann auf OK.

dies funktionierte für mich in meinem IIS von Windows Server 2016 und lokalen IIS Windows 10.

2voto

Segfault Punkte 7666

Um noch eine weitere mögliche Lösung in den Raum zu werfen, möchte ich den Fall erwähnen, der mir bei dieser Fehlermeldung begegnet ist. Die Methode Bitmap.Save löste diese Ausnahme aus, wenn ich eine Bitmap speicherte, die ich transformiert hatte und anzeigte. Ich entdeckte, dass die Ausnahme nicht ausgelöst wurde, wenn die Anweisung einen Haltepunkt enthielt, und auch nicht, wenn die Bitmap.Save vorausgegangen war Thread.Sleep(500) Ich nehme also an, dass es zu einer Art Ressourcenkonkurrenz kommt.

Ein einfaches Kopieren des Bildes in ein neues Bitmap-Objekt reichte aus, um das Auftreten dieser Ausnahme zu verhindern:

new Bitmap(oldbitmap).Save(filename);

2voto

Chris Halcrow Punkte 25120
  • Ich hatte dieses Problem auf einem Testserver, aber nicht auf dem Live-Server.
  • Ich habe das Bild in einen Stream geschrieben, also war es kein Problem mit der Berechtigung.
  • Ich habe einige der .dlls direkt auf dem Testserver bereitgestellt.
  • Durch die Bereitstellung der gesamten Lösung wurde das Problem behoben, so dass es sich wahrscheinlich um einen Kompilierungsfehler handelte

2voto

tech-gayan Punkte 1313

Wir hatten ein ähnliches Problem bei der Erstellung eines PDF oder die Bildgröße mit der ImageProcessor-Lib auf dem Produktionsserver ändern.

Recyceln des Anwendungspools das Problem zu beheben.

1voto

jeka Punkte 51
byte[] bts = (byte[])page1.EnhMetaFileBits; 
using (var ms = new MemoryStream(bts)) 
{ 
    var image = System.Drawing.Image.FromStream(ms); 
    System.Drawing.Image img = image.GetThumbnailImage(200, 260, null, IntPtr.Zero);      
    img.Save(NewPath, System.Drawing.Imaging.ImageFormat.Png);
}

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