Ich habe einige Binärdaten, die ich als Bild speichern möchte. Wenn ich versuche, das Bild zu speichern, wird eine Ausnahme ausgelöst, wenn der zum Erstellen des Bildes verwendete Speicherstrom vor dem Speichern geschlossen wurde. Der Grund, warum ich das mache, ist, dass ich dynamisch Bilder erstelle und als solches .. Ich muss einen Speicherstrom verwenden.
Das ist der Code:
[TestMethod]
public void TestMethod1()
{
// Grab the binary data.
byte[] data = File.ReadAllBytes("Chick.jpg");
// Read in the data but do not close, before using the stream.
Stream originalBinaryDataStream = new MemoryStream(data);
Bitmap image = new Bitmap(originalBinaryDataStream);
image.Save(@"c:\test.jpg");
originalBinaryDataStream.Dispose();
// Now lets use a nice dispose, etc...
Bitmap2 image2;
using (Stream originalBinaryDataStream2 = new MemoryStream(data))
{
image2 = new Bitmap(originalBinaryDataStream2);
}
image2.Save(@"C:\temp\pewpew.jpg"); // This throws the GDI+ exception.
}
Hat jemand Vorschläge, wie ich ein Bild bei geschlossenem Stream speichern könnte? Ich kann mich nicht darauf verlassen, dass die Entwickler daran denken, den Stream nach dem Speichern des Bildes zu schließen. Tatsächlich hätte der Entwickler KEINE IDEE, dass das Bild unter Verwendung eines Speicherstroms erzeugt wurde (weil es in einem anderen Code an anderer Stelle vorkommt).
Ich bin wirklich verwirrt :(
using
Blocks. Ich denke dasoriginalBinaryDataStream2
wurde am Ende der Nutzung automatisch entsorgt. Und das würde die Ausnahme werfen.Antworten:
Da es ein Memorystream ist, haben Sie wirklich nicht brauchen , um den Strom zu schließen - nichts Schlimmes passieren wird , wenn Sie es nicht tun, obwohl offensichtlich ist es gute Praxis Verfügungs alles , was Einweg ohnehin ist. (Weitere Informationen hierzu finden Sie in dieser Frage .)
Sie sollten jedoch die Bitmap entsorgen - und das schließt den Stream für Sie. Wenn Sie dem Bitmap-Konstruktor einen Stream geben, "besitzt" er den Stream und Sie sollten ihn nicht schließen. Wie die Dokumente für diesen Konstruktor sagen:
Ich kann keine Dokumente finden, die versprechen, den Stream zu schließen, wenn Sie die Bitmap entsorgen, aber Sie sollten dies ziemlich einfach überprüfen können.
quelle
In GDI + ist ein generischer Fehler aufgetreten. Kann auch aus einem falschen Speicherpfad resultieren ! Ich habe einen halben Tag gebraucht, um das zu bemerken. Stellen Sie daher sicher, dass Sie den Pfad überprüft haben, um das Bild ebenfalls zu speichern.
quelle
C\Users\mason\Desktop\pic.png
. Fehlender Doppelpunkt! Ich hätte ewig verbracht, bevor ich das bemerkt hätte.Vielleicht ist es erwähnenswert, dass wenn das Verzeichnis C: \ Temp nicht existiert, diese Ausnahme auch dann ausgelöst wird, wenn Ihr Stream noch vorhanden ist.
quelle
Ich hatte das gleiche Problem, aber die Ursache war, dass die Anwendung keine Berechtigung zum Speichern von Dateien auf C hatte. Als ich zu "D: \ .." wechselte, wurde das Bild gespeichert.
quelle
Kopieren Sie die Bitmap. Sie müssen den Stream für die Lebensdauer der Bitmap offen halten.
Beim Zeichnen eines Bildes: System.Runtime.InteropServices.ExternalException: In GDI ist ein generischer Fehler aufgetreten
quelle
RawFormat
wichtig das ist. Wenn Sie , dass verwenden möchten, rufen Sie sie aus dem Objekt irgendwo auf dem Weg, aber im Allgemeinen, speichern als wie auch immer geartete wollen Sie tatsächlich haben .Sie können versuchen, eine weitere Kopie der Bitmap zu erstellen:
quelle
Dieser Fehler ist mir beim Versuch von Citrix eingefallen. Der Image-Ordner wurde auf dem Server auf C: \ gesetzt, für den ich keine Berechtigung habe. Sobald der Image-Ordner auf ein freigegebenes Laufwerk verschoben wurde, war der Fehler behoben.
quelle
In GDI + ist ein generischer Fehler aufgetreten. Dies kann aufgrund von Problemen mit Bildspeicherpfaden auftreten. Ich habe diesen Fehler erhalten, weil mein Speicherpfad zu lang ist. Ich habe dies behoben, indem ich das Bild zuerst auf einem kürzesten Pfad gespeichert und mit Techniken zur Behandlung langer Pfade an den richtigen Ort verschoben habe.
quelle
Ich habe diesen Fehler erhalten, weil der automatisierte Test, den ich ausgeführt habe, versucht hat, Snapshots in einem Ordner zu speichern, der nicht vorhanden war. Nachdem ich den Ordner erstellt habe, wurde der Fehler behoben
quelle
Eine seltsame Lösung, die meinen Code zum Laufen brachte. Öffnen Sie das Bild in Farbe und speichern Sie es als neue Datei mit demselben Format (.jpg). Versuchen Sie es jetzt mit dieser neuen Datei und es funktioniert. Es erklärt Ihnen deutlich, dass die Datei auf irgendeine Weise beschädigt sein könnte. Dies kann nur helfen, wenn in Ihrem Code alle anderen Fehler behoben sind
quelle
Es ist auch bei mir aufgetaucht, als ich versucht habe, ein Bild im Pfad zu speichern
C:\Program Files (x86)\some_directory
und das
.exe
wurde nicht ausgeführt, um als Administrator ausgeführt zu werden. Ich hoffe, dies kann jemandem helfen, der das gleiche Problem hat.quelle
Für mich stürzte der folgende Code
A generic error occurred in GDI+
in der Zeile ab, die in a speichertMemoryStream
. Der Code wurde auf einem Webserver ausgeführt und ich habe ihn behoben, indem ich den Anwendungspool gestoppt und gestartet habe, auf dem die Site ausgeführt wurde.Muss ein interner Fehler in GDI + gewesen sein
quelle
Ich bin auf diesen Fehler gestoßen, als ich eine einfache Bildbearbeitung in einer WPF-App versuchte.
Durch Festlegen der Quelle eines Bildelements auf die Bitmap wird das Speichern von Dateien verhindert. Selbst das Setzen von Source = null scheint die Datei nicht freizugeben.
Jetzt verwende ich das Bild einfach nie mehr als Bildquelle, sodass ich es nach der Bearbeitung überschreiben kann!
BEARBEITEN
Nachdem ich von der CacheOption-Eigenschaft gehört hatte (Dank an @Nyerguds), fand ich die Lösung: Anstatt den Bitmap-Konstruktor zu verwenden, muss ich den Uri nach dem Festlegen festlegen
CacheOption
BitmapCacheOption.OnLoad
(Image1
unten ist das Wpf-Image
Element).Anstatt
Verwenden:
Siehe dies: WPF Image Caching
quelle
BitmapCacheOption.OnLoad
, um sie von der Ladequelle zu trennen.Versuchen Sie diesen Code:
quelle
Ich habe den Bildprozessor zum Ändern der Bildgröße verwendet und eines Tages die Ausnahme "In GDI + ist ein generischer Fehler aufgetreten" erhalten.
Nachdem ich eine Weile nachgeschlagen hatte, versuchte ich , den Anwendungspool und das Bingo zu recyceln, das funktioniert. Also notiere ich es hier, hoffe es hilft;)
Prost
quelle