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.
- Klonen Sie das Bild und arbeiten Sie daran.
- Abrufen des Encoders für dieses MIME, der diesen mit der JPEG-Qualitätseinstellung übergibt.
Antworten:
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.
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
quelle
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.
quelle
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 mit
A generic error occurred in GDI+
.Sie können dies selbst mit einem Test überprüfen:
Es ist schade, dass
ArgumentException
im Konstruktor von kein freundliches .net geworfen wirdBitmap
.quelle
Dieser Artikel erklärt ausführlich, was genau passiert: Abhängigkeiten von Bitmap- und Image-Konstruktoren
Kurz gesagt, für ein Leben lang
Image
aus einem Strom aufgebaut Stroms darf der Strom nicht zerstört werden.Also statt
Versuche dies
und schließen Sie imageStream beim Schließen des Formulars oder beim Schließen der Webseite.
quelle
using
und versuchte später, das Bild in einen Speicher-Stream zu kopieren, und erhielt die gefürchtete Nachricht "Allgemeiner Fehler in GDI +".PixelFormat.Format32bppArgb
aber nichtPixelFormat.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.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.
Und vergessen Sie nicht, Ihre Datei zu bereinigen.
quelle
Bild in Bitmap-Variable speichern
quelle
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."
quelle
Ich habe diesen Fehler auch beim Speichern von JPEGs erhalten, aber nur für bestimmte Bilder.
Mein letzter Code:
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:
quelle
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.
quelle
Wenn Ihr Code wie folgt lautet, tritt auch dieser Fehler auf
Der richtige ist
Dies kann daran liegen, dass wir vom using-Block zurückkehren
quelle
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.
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.
quelle
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
Hoffe das hilft.
quelle
Fehler aufgrund der Berechtigung. Stellen Sie sicher, dass der Ordner über ALLE ERLAUBNIS verfügt.
quelle
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.
quelle
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.quelle
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!
quelle
Ich bin dran!
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.
quelle
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.
quelle
Ich stelle fest, dass Ihr "JPEG" -Fall tatsächlich ist:
Sind Sie sicher, dass das Format JPEG ist und nicht etwas anderes?
Ich würde versuchen:
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?
quelle
quelle
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.Save
würde diese Ausnahme auslösen, wenn eine Bitmap gespeichert wird, die ich transformiert und angezeigt habe. Ich habe festgestellt, dass es keine AusnahmeBitmap.Save
auslö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:
quelle
Wir hatten ein ähnliches Problem beim Generieren eines
PDF
Bildes oder beim Ändern der Bildgröße mit ImageProcessor lib auf dem Produktionsserver.Recycling des Anwendungspools Beheben Sie das Problem.
quelle
Wenn Sie versuchen , ein Bild zu einem speichern entfernten Ort sicher sein , die hinzuzufügen
NETWORK_SERVICE
Benutzerkonto in die Sicherheitseinstellungen und gibt den Benutzer Lese- und Schreibrechte. Sonst wird es nicht funktionieren.quelle
quelle
Ich erhalte auch diesen Fehler, weil ich versuche, Bilder mit dem gleichen Namen wie zuvor gespeicherte Bilder zu speichern.
Stellen Sie sicher, dass Sie keine Bilder mit doppeltem Namen speichern.
Verwenden Sie dazu beispielsweise eine 'Zufalls'-Funktion ( Wie funktioniert der Zufallszahlengenerator von C #? ) Oder generieren Sie beispielsweise eine Guid ( http://betterexplained.com/articles/the-quick-guide-to-guids/ ).
quelle
Einfach, erstellen Sie eine neue Instanz von Bitmap, um das Problem zu lösen.
quelle
Für mich benutzte ich das
Image.Save(Stream, ImageCodecInfo, EncoderParameters)
und anscheinend verursachte dies den berüchtigtenA generic error occurred in GDI+
Fehler.Ich habe versucht,
EncoderParameter
die 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
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:
anstatt
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.
quelle
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.
quelle
Mögliche Probleme, die einen solchen Fehler verursachen, sind:
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!
quelle