Frage

Ich war Bitmap-Grafik aus einer Datei laden. Als ich versuchte, das Bild auf eine andere Datei zu speichern „aufgetreten Ein allgemeiner Fehler in GDI +“ Ich habe die folgende Fehlermeldung. Ich glaube, das liegt daran, dass die Datei durch das Bildobjekt gesperrt ist.

Ok, so versucht, die Image.Clone Funktion aufrufen. Dies verriegelt noch die Datei.

hmm. Als nächstes versuche ich, ein Bitmap-Bild von einem Filestream geladen und das Bild in den Speicher laden, so GDI + die Datei nicht sperren. Dies funktioniert gut, außer ich Thumbnails müssen generieren Methode Image.GetThumbnailImage es nicht genügend Arbeitsspeicher Ausnahme auslöst. Anscheinend muss ich den Strom offen zu halten, diese Ausnahme zu stoppen, aber wenn ich den Strom offen halten dann die Datei bleibt gesperrt.

So nicht gut mit dieser Methode. Am Ende habe ich eine Kopie der Datei. So, jetzt habe ich 2 Versionen der Datei. 1 Ich kann in meinem c # Programm sperren und manipulieren. Diese andere Originaldatei bleibt entsperrt, auf die ich Änderungen speichern können. Dies hat den Bonus von mir erlaubt, Änderungen rückgängig machen, selbst nachdem sie zu speichern, weil ich die Kopie der Datei bin Manipulation, die nicht ändern kann.

Sicherlich gibt es einen besseren Weg, dies zu erreichen, ohne dass zwei Versionen der Bilddatei müssen. Irgendwelche Ideen?

War es hilfreich?

Lösung 2

Ich habe eine alternative Methode gefunden, da das Bild zu klonen, ohne die Datei zu verriegeln. Bob Powell hat sie alle plus mehr GDI-Ressourcen .

      //open the file
      Image i = Image.FromFile(path);

      //create temporary
      Image t=new Bitmap(i.Width,i.Height);

      //get graphics
      Graphics g=Graphics.FromImage(t);

      //copy original
      g.DrawImage(i,0,0);

      //close original
      i.Dispose();

      //Can now save
      t.Save(path)

Andere Tipps

Nun, wenn Sie nach anderen Möglichkeiten freuen zu tun, was Sie fragen, ich denke, es sollte einen Memorystream zu erstellen arbeiten, und das Filestream, um es zu lesen, und das Bild von diesem Strom geladen werden ...

var stream = new FileStream("original-image", FileMode.Open);
var bufr = new byte[stream.Length];
stream.Read(bufr, 0, (int)stream.Length);
stream.Dispose();

var memstream = new MemoryStream(bufr);
var image = Image.FromStream(memstream);

Oder etwas hübschere in diesem Ausmaß.

Ob oder ob nicht, das ist die Art, wie Sie über die Lösung dieses Problems gehen sollten, ich weiß es nicht. :) Ich habe ein ähnliches Problem hatte und Liquidation es so fixiert wird.

Ich hatte ein ähnliches Problem. Aber ich wusste, dass ich das Bild als Bitmap-Datei speichern wird. Also habe ich diese:

    public void SaveHeightmap(string path)
    {
        if (File.Exists(path))
        {
            Bitmap bitmap = new Bitmap(image); //create bitmap from image
            image.Dispose(); //delete image, so the file

            bitmap.Save(path); //save bitmap

            image = (Image) bitmap; //recreate image from bitmap
        }
        else
            //...
    }

Sicher, das ist nicht der beste Weg, aber seine Arbeiten: -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top