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

326

Dies scheint ein berüchtigter Fehler im gesamten Web zu sein. So sehr, dass ich keine Antwort auf mein Problem finden konnte, da mein Szenario nicht passt. Eine Ausnahme wird ausgelöst, wenn ich das Bild im Stream speichere.

Seltsamerweise funktioniert dies perfekt mit einem PNG, gibt aber den obigen Fehler mit JPG und GIF, was ziemlich verwirrend ist.

Das ähnlichste Problem besteht darin, Bilder in Dateien ohne Berechtigungen zu speichern. Ironischerweise besteht die Lösung darin, 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();
    }
}

Weitere Details zur Ausnahme. Der Grund, warum dies so viele Probleme verursacht, ist die fehlende 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 versucht habe.

  1. Klonen Sie das Bild und arbeiten Sie daran.
  2. Abrufen des Encoders für dieses MIME, der diesen mit der JPEG-Qualitätseinstellung übergibt.
madcapnmckay
quelle
Verwandte: stackoverflow.com/questions/4671449/…
Patrick Szalapski
3
Für mich war das Problem, dass der Ordner nicht vorhanden war. Behoben durch einfaches Erstellen des Ordners.
Hazjack
Für mich war es ein Index außerhalb des Bereichs, der verschluckt wurde.
Billy Jake O'Connor

Antworten:

189

OK, ich habe die Ursache anscheinend nur durch reines Glück gefunden und es ist nichts Falsches an dieser speziellen Methode, sie ist weiter hinten im Aufrufstapel.

Früher habe ich die Größe des Bildes geändert und als Teil dieser Methode das verkleinerte Objekt wie folgt zurückgegeben. Ich habe zwei Aufrufe der obigen Methode und ein direktes Speichern in einer Datei eingefügt.

// At this point the new bitmap has no MimeType
// Need to output to memory stream
using (var m = new MemoryStream())
{
       dst.Save(m, format);

       var img = Image.FromStream(m);

       //TEST
       img.Save("C:\\test.jpg");
       var bytes = PhotoEditor.ConvertImageToByteArray(img);


       return img;
 }

Es scheint, dass der Speicherstrom, in dem das Objekt erstellt wurde , zum Zeitpunkt des Speicherns des Objekts geöffnet sein muss. Ich bin mir nicht sicher, warum das so ist. Kann mich jemand aufklären und wie ich das umgehen kann?

Ich kehre nur aus einem Strom , weil nach dem Resize Code ähnlich mit dieser die Zieldatei hat einen unbekannten Mime - Typen (img.RawFormat.Guid) und Id wie der Mime - Typ korrekt auf allen Bildobjekte sein , wie es es schwer Schreib Generika macht Umgang mit Code anders.

BEARBEITEN

Dies ist bei meiner ersten Suche nicht aufgetaucht, aber hier ist die Antwort von Jon Skeet

madcapnmckay
quelle
4
Mir war nicht klar, dass Sie den Stream nicht schließen sollten, wenn Sie eine Bitmap aus einem Speicher-Stream erhalten. sehr hilfreich, danke
mcdon
38
Vielen Dank. Dies hat wahrscheinlich das letzte meiner Haare gerettet.
NotMe
6
Vielen Dank! Dies hat mir jedoch viel Zeit gespart. Eines würde es Ihnen etwas ausmachen, die Ursache für den Fehler zu Beginn Ihrer Antwort herauszustellen, da ich (und ich denke, die meisten Falken) ihn beim Durchsuchen der Antworten verpasst habe, vielleicht so etwas wie " SCHLIESSEN SIE DEN SPEICHERSTREAM NICHT, WENN SIE DAS BILD WIEDER VERWENDEN WOLLEN "wäre großartig; D
DorD
6
Was ist Ihre "dst" -Variable?
WEFX
1
@madcapnmckay erklären Sie bitte, was die 'dst'-Variable ist und ihre Bedeutung
Mike T
131

Wenn Sie diesen Fehler erhalten, kann ich sagen, dass Ihre Anwendung keine Schreibberechtigung für ein Verzeichnis hat.

Wenn Sie beispielsweise versuchen, das Image aus dem Speicherstrom im Dateisystem zu speichern, wird möglicherweise dieser Fehler angezeigt.

Wenn Sie XP verwenden, müssen Sie die Schreibberechtigung für das Aspnet-Konto in diesem Ordner hinzufügen.

Wenn Sie Windows Server (2003, 2008) oder Vista verwenden, stellen Sie sicher, dass Sie Schreibberechtigung für das Netzwerkdienstkonto hinzufügen.

Hoffe es hilft jemandem.

Savindra
quelle
7
Das hast du nicht! Ich habe 2 Stunden mit den verdammten Schreibberechtigungen verschwendet ... Kam hierher, um dies zu posten. Hoffe du bekommst mehr Upvotes. :)
Gleno
2
DAS war die Lösung für mich. +1 total!
Grandizer
5
Sie können File.WriteAllText ("filename.jpg", "") und dann File.DeleteFile ("filename.jpg") ausführen, bevor Sie die Bitmap speichern. In meinem Benmark dauert dies nur 0,001 Sekunden und Sie erhalten ein nettes "Sie haben keine Berechtigung, filename.jpg dort zu speichern"
Despertar
@ Despertar Du meinst File.Delete (), aber das ist ein sehr praktischer Trick! Ich werde dies auf jeden Fall verwenden, wenn ich eine Bitmap speichere.
D Coetzee
2
In meinem Fall existierte das Verzeichnis nicht.
Stille
54

Ich werde diese Fehlerursache auch in der Hoffnung hinzufügen, dass sie einem zukünftigen Internetreisenden hilft. :) :)

GDI + begrenzt die maximale Höhe eines Bildes auf 65500

Wir führen einige grundlegende Bildgrößenänderungen durch, aber bei der Größenänderung versuchen wir, das Seitenverhältnis beizubehalten. Wir haben einen QS-Mann, der in diesem Job etwas zu gut ist. Er beschloss, dies mit einem EIN Pixel breiten Foto zu testen, das 480 Pixel groß war. Als das Bild auf unsere Abmessungen skaliert wurde, lag die Höhe nördlich von 68.000 Pixel und unsere App explodierte mitA generic error occurred in GDI+ .

Sie können dies selbst mit einem Test überprüfen:

  int width = 480;
  var height = UInt16.MaxValue - 36; //succeeds at 65499, 65500
  try
  {
    while(true)
    {
      var image = new Bitmap(width, height);
      using(MemoryStream ms = new MemoryStream())
      {
        //error will throw from here
        image.Save(ms, ImageFormat.Jpeg);
      }
      height += 1;
    }
  }
  catch(Exception ex)
  {
    //explodes at 65501 with "A generic error occurred in GDI+."
  }

Es ist schade, dass ArgumentExceptionim Konstruktor von kein freundliches .net geworfen wird Bitmap.

Fred
quelle
17
Vielen Dank - dieser Internet-Zeitreisende ist sehr dankbar, dass Sie diese Nachricht hinterlassen haben.
Tom West
Nach meinen Tests ist 65535 tatsächlich der Maximalwert. Bei 65536 sehe ich den generischen Fehler.
ChaseMedallion
Ich habe es gerade noch einmal versucht: Win10 .net 4.5 und .net 4.6.1, und es explodierte bei 65501, was noch zufälliger erscheint. Code ist auch mit Syntaxfehlern behaftet, wird aktualisiert :)
Fred
37

Dieser Artikel erklärt ausführlich, was genau passiert: Abhängigkeiten von Bitmap- und Image-Konstruktoren

Kurz gesagt, für ein Leben lang Imageaus einem Strom aufgebaut Stroms darf der Strom nicht zerstört werden.

Also statt

using (var strm = new ... )  {
    myImage = Image.FromStream(strm);
}

Versuche dies

Stream imageStream;
...

    imageStream = new ...;
    myImage = Image.FromStream(strm);

und schließen Sie imageStream beim Schließen des Formulars oder beim Schließen der Webseite.

Ivan Mesic
quelle
Ja, dieser hat mich erwischt. Ich war gewissenhaft und wickelte meinen Stream in einen ein usingund versuchte später, das Bild in einen Speicher-Stream zu kopieren, und erhielt die gefürchtete Nachricht "Allgemeiner Fehler in GDI +".
Will Appleby
Ihr Link gab mir unendliche Weiterleitungen; Dieser funktioniert. Ich hatte ein Problem mit dem Speichern, PixelFormat.Format32bppArgbaber nicht PixelFormat.Format1bppIndexed. In dem von Ihnen verlinkten Artikel wird erklärt, warum: GDI + möglicherweise Bitmap-Daten aus dem Quelldatenstrom neu dekodiert, anstatt alles im Speicher zu belassen. Ich vermute, dass 1bpp-Bilder nicht neu dekodiert werden.
Labreuer
Auch der neue Link funktioniert nicht mehr. Eine einfache Google-Suche schien nicht die richtige Seite zu zeigen. Aber ich war sehr froh, diese Antwort zu finden! Meine
Umgehung
28

Diese Ausnahme wird auch angezeigt, wenn Sie versuchen, in einem ungültigen Pfad zu speichern, oder wenn ein Berechtigungsproblem vorliegt.

Wenn Sie nicht 100% sicher sind, dass der Dateipfad verfügbar ist und die Berechtigungen korrekt sind, schreiben Sie eine in eine Textdatei. Dies dauert nur wenige Sekunden, um eine sehr einfache Lösung auszuschließen.

var img = System.Drawing.Image.FromStream(incomingStream);

// img.Save(path);
System.IO.File.WriteAllText(path, "Testing valid path & permissions.");

Und vergessen Sie nicht, Ihre Datei zu bereinigen.

Kirk Broadhurst
quelle
Dies war das Problem für mich ... Ich wünschte, der Fehler wäre weniger vage, hätte mir viel Zeit gespart.
Oofpez
Ja! Der Ordner, in dem Sie speichern, muss vorhanden sein. Ich überprüfe dies jetzt zuerst, bevor ich versuche, ein Bild zu speichern. (Trotzdem erwischt mich der Fehler ungefähr einmal im Jahr.)
Magnus Smith
Mein Pfad war ein Verzeichnis anstelle einer Datei.
Asen Kasimov
20

Bild in Bitmap-Variable speichern

using (var ms = new MemoryStream())
{
    Bitmap bmp = new Bitmap(imageToConvert);
    bmp.Save(ms, format);
    return ms.ToArray();
}
Amir Atashin
quelle
Dies hat mein Problem gelöst. Können Sie erklären, warum das Speichern des Bildes in Bitmap die Ausnahme abschreckt?
JMC
Ich habe meinen Tag gerettet. Ich weiß nicht, was das Problem verursacht hat, aber das Speichern von Bitmap funktioniert. System.Drawing.Image speichert nicht im Speicherstrom, Bitmap jedoch !!!
San
Dies war die beste Lösung für mich. Neue Bitmap erstellen und daraus konvertieren.
uzay95
Keine Ahnung, wie diese Magie funktioniert - aber sie funktioniert.
Ziv Weissman
17

Nur für den Fall, dass jemand so dummes Zeug macht wie ich. 1. Stellen Sie sicher, dass der Pfad vorhanden ist. 2. Stellen Sie sicher, dass Sie über Schreibrechte verfügen. 3. Stellen Sie sicher, dass Ihr Pfad korrekt ist. In meinem Fall fehlte mir der Dateiname im TargetPath :(

Es sollte gesagt haben, Ihr Pfad ist schlecht als "Ein generischer Fehler ist in GDI + aufgetreten."

ahsant
quelle
16

Ich habe diesen Fehler auch beim Speichern von JPEGs erhalten, aber nur für bestimmte Bilder.

Mein letzter Code:

  try
  {
    img.SaveJpeg(tmpFile, quality); // This is always successful for say image1.jpg, but always throws the GDI+ exception for image2.jpg
  }
  catch (Exception ex)
  {
    // Try HU's method: Convert it to a Bitmap first
    img = new Bitmap(img); 
    img.SaveJpeg(tmpFile, quality); // This is always successful
  }

Ich habe die Bilder nicht erstellt, daher kann ich den Unterschied nicht erkennen.
Ich würde mich freuen, wenn jemand das erklären könnte.

Dies ist meine SaveJpeg-Funktion, nur zu Ihrer Information:

private static void SaveJpeg(this Image img, string filename, int quality)
{
  EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, (long)quality);
  ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
  EncoderParameters encoderParams = new EncoderParameters(1);
  encoderParams.Param[0] = qualityParam;
  img.Save(filename, jpegCodec, encoderParams);
}

private static ImageCodecInfo GetEncoderInfo(string mimeType)
{
    var encoders = ImageCodecInfo.GetImageEncoders();
    var encoder = encoders.SingleOrDefault(c => string.Equals(c.MimeType, mimeType, StringComparison.InvariantCultureIgnoreCase));
    if (encoder == null) throw new Exception($"Encoder not found for mime type {mimeType}");
    return encoder;
}
Aximili
quelle
1
Dies löste Tage des Haarziehens auf. Es ist der wtf-Code, den ich je geschrieben habe :)
Jeff Dunlop
13

Ich stellte fest, dass GDI + die generische Ausnahme auslösen würde, wenn einer der übergeordneten Ordner, in denen ich die Datei gespeichert habe, einen nachgestellten Speicherplatz hätte.

Mit anderen Worten, wenn ich versucht habe, unter "C: \ Dokumente und Einstellungen \ mein Benutzername \ Lokale Einstellungen \ Temp \ ABC DEF M1 Trendwerte \ Images \ picture.png" zu speichern, wurde die generische Ausnahme ausgelöst.

Mein Ordnername wurde aus einem Dateinamen generiert, der zufällig ein nachfolgendes Leerzeichen hatte, sodass es einfach war, .Trim () zu verwenden und fortzufahren.

Igilima
quelle
3
genial - ich hätte nie gedacht, den Verzeichnispfad so genau zu betrachten
jharr100
11

Wenn Ihr Code wie folgt lautet, tritt auch dieser Fehler auf

private Image GetImage(byte[] byteArray)
{
   using (var stream = new MemoryStream(byteArray))
   {
       return Image.FromStream(stream);
    }
}

Der richtige ist

private Image GetImage(byte[] byteArray)
{
   var stream = new MemoryStream(byteArray))
   return Image.FromStream(stream);        
}

Dies kann daran liegen, dass wir vom using-Block zurückkehren

Dhinesh
quelle
Für mich war es die Rückkehr in den using-Block. Ich benutze immer noch using, aber ich gebe den Wert außerhalb des Blocks zurück. Vielen Dank!
Dragouf
1
Ich habe "auf die harte Tour" herausgefunden, dass Sie, wenn Sie das Image erneut in einem neuen Stream speichern (wie z. B. HttpContext.Response.OutputStream), auch einen Stream.Flush () erstellen müssen, wenn der Fehler nicht auftritt nochmal.
Lucian
11

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

Basierend auf meinen Tests ist es möglich, Bilder mit einer Höhe von mehr als 65534 zu erstellen / zu bearbeiten. Das Problem tritt jedoch beim Speichern in einem Stream oder einer Datei IN BESTIMMTEN FORMATEN auf . Im folgenden Code löst der Methodenaufruf t.Save () unserem Freund die generische Ausnahme aus, wenn die Pixelhöhe für mich 65501 beträgt. Aus Neugier wiederholte ich den Test auf 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.

Dies reicht für mich bis zu einer Höhe / Breite von 100.000 - ich habe die Grenzen nicht getestet. Wie es passiert. Tiff war eine praktikable Option für uns.

SEI GEWARNT

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

Vipes
quelle
10

Hatte ein sehr ähnliches Problem und versuchte auch, das Bild zu klonen, was nicht funktioniert. Ich fand, 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 Strom z

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

Hoffe das hilft.

HU.
quelle
6

Fehler aufgrund der Berechtigung. Stellen Sie sicher, dass der Ordner über ALLE ERLAUBNIS verfügt.

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")
Gaurang s
quelle
Ich stimme dir zu. Ich habe dieses Problem mit PERMISSION
Praguan
5

Gelöst - ich hatte genau dieses Problem. Für mich bestand die Lösung darin, das Festplattenkontingent für IUSR auf dem IIS-Server zu erhöhen. In diesem Fall haben wir eine Katalog-App mit Bildern von Artikeln und dergleichen. Das Upload-Kontingent für den "anonymen Webbenutzer" wurde auf 100 MB festgelegt. Dies ist die Standardeinstellung für die IIS-Server dieses Hosting-Unternehmens. Ich habe es auf 400 MB erhöht und konnte Bilder ohne Fehler hochladen.

Dies ist möglicherweise nicht Ihr Problem, aber wenn ja, ist es eine einfache Lösung.

Marco
quelle
4

In meinem Fall lag das Problem in dem Pfad, den ich gespeichert habe (der Stamm C:\). Wenn Sie es so ändern, D:\111\dass die Ausnahme verschwindet.

Ani
quelle
4

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

Hatte gerade diesen Fehler, weil ich einen Dateinamen und keinen vollständigen Pfad eingegeben habe!

Es passiert!

MytyMyky
quelle
4

Ich bin dran!

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

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

Andy
quelle
4

Das gleiche Problem, mit dem ich konfrontiert war. In meinem Fall habe ich jedoch versucht, eine Datei auf Laufwerk C zu speichern, auf die nicht zugegriffen werden konnte. Also habe ich versucht, in D-Laufwerk zu speichern, das vollständig zugänglich war, und es ist mir gelungen.

Überprüfen Sie also zuerst Ihre Ordner, in denen Sie speichern möchten. Sie müssen alle (Lese- und Schreib-) Rechte für diesen bestimmten Ordner haben.

Jaimin
quelle
Ursache Normalerweise ist c ohne Administratorberechtigung nicht zulässig.
Aneeq Azam Khan
2

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

            default:
                format = ImageFormat.Jpeg;
                break;

Sind Sie sicher, dass das Format JPEG ist und nicht etwas anderes?

Ich würde versuchen:

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

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

AKTUALISIEREN

Gibt es eine andere Initialisierung, die Sie für das MemoryStream-Objekt vornehmen müssen?

ChrisF
quelle
Vielen Dank. Es wird definitiv mit dem richtigen Format aufgerufen. Ich lade ein JPG, debugge und bestätige, dass die MIME als Bild / JPEG erkannt wird und das Format JPG ist.
Madcapnmckay
3
Na ja - ich versuche immer zuerst das Offensichtliche zu beseitigen. Ich kann nicht zählen, wie oft ich das nicht getan habe und es kommt zurück, um mich später zu beißen.
ChrisF
2
  • Ich hatte dieses Problem auf einem Testserver, aber nicht auf dem Live-Server.
  • Ich habe das Bild in einen Stream geschrieben, es war also kein Berechtigungsproblem.
  • Ich habe einige der DLLs direkt auf dem Testserver bereitgestellt.
  • Durch die Bereitstellung der gesamten Lösung wurde das Problem behoben, sodass es wahrscheinlich zu einer seltsamen Nichtübereinstimmung bei der Kompilierung kam
Chris Halcrow
quelle
2

Um eine weitere mögliche Lösung auf den Stapel zu werfen, erwähne ich den Fall, auf den ich mit dieser Fehlermeldung gestoßen bin. Die Methode Bitmap.Savewürde diese Ausnahme auslösen, wenn eine Bitmap gespeichert wird, die ich transformiert und angezeigt habe. Ich habe festgestellt, dass es keine Ausnahme Bitmap.Saveauslösen würde, wenn die Anweisung einen Haltepunkt enthält, und auch nicht, wenn der vorangestellt wird, Thread.Sleep(500)sodass vermutlich eine Art Ressourcenkonflikt stattfindet.

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

new Bitmap(oldbitmap).Save(filename);
Segfault
quelle
2

Wir hatten ein ähnliches Problem beim Generieren eines PDFBildes oder beim Ändern der Bildgröße mit ImageProcessor lib auf dem Produktionsserver.

Recycling des Anwendungspools Beheben Sie das Problem.

Tech-Gayan
quelle
1

Wenn Sie versuchen , ein Bild zu einem speichern entfernten Ort sicher sein , die hinzuzufügen NETWORK_SERVICEBenutzerkonto in die Sicherheitseinstellungen und gibt den Benutzer Lese- und Schreibrechte. Sonst wird es nicht funktionieren.

JAH
quelle
1
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);
}
Jeka
quelle
1

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

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

Für mich benutzte ich das Image.Save(Stream, ImageCodecInfo, EncoderParameters)und anscheinend verursachte dies den berüchtigten A generic error occurred in GDI+Fehler.

Ich habe versucht, EncoderParameterdie JPEGs in 100% Qualität zu speichern. Dies funktionierte perfekt auf "meiner Maschine" (doh!) Und nicht auf der Produktion.

Als ich das Image.Save(Stream, ImageFormat)stattdessen benutzte , verschwand der Fehler! Also habe ich wie ein Idiot letzteres weiter verwendet, obwohl es sie in Standardqualität speichert, von der ich annehme, dass sie nur 50% beträgt.

Hoffe diese Info hilft jemandem.

Ε Г И І І О
quelle
0

Ich bin auch auf das Problem gestoßen. Das Problem war darauf zurückzuführen, dass der Ladestrom entsorgt wurde. Aber ich habe es nicht entsorgt, es befand sich im .Net-Framework. Alles was ich tun musste war zu benutzen:

image_instance = Image.FromFile(file_name);

anstatt

image_instance.Load(file_name);

image_instance ist vom Typ System.Windows.Forms.PictureBox! PictureBoxs Load () stellt den Stream bereit, aus dem das Bild geladen wurde, und das wusste ich nicht.

Klaus
quelle
0

Basierend auf der Antwort von @savindra sollte Ihr Problem behoben sein, wenn Sie RHM in Ihrer Anwendung verwenden und versuchen, es als Administrator auszuführen .

Meins schien ein Erlaubnisproblem zu sein.

AltF4_
quelle
0

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

  1. Verzeichnis existiert nicht (Die von Ihnen aufgerufene Methode erstellt dieses Verzeichnis nicht automatisch für Sie)
  2. Die Sicherheitsberechtigungen zum Schreiben in das Ausgabeverzeichnis ermöglichen es dem Benutzer, der die App ausführt, nicht zu schreiben

Ich hoffe das hilft, das war die Lösung für mein Problem, ich habe einfach sichergestellt, dass das Ausgabeverzeichnis existiert, bevor ich das Ausgabebild speichere!

Ihab Hajj
quelle