[WPF C#]Erstellte Datei aus BitmapSource bleibt vom prozess gesperrt

12/25/2014 00:32 Legend2007#1
Nabend allen,

Wie im Titel erwähnt kriege Ich dies nicht richtig gebacken.

Hier ist mal ein bisschen code:

Version 1:
Code:
BitmapSource bmpSource = Snapshot.TakeSnapshot((int)contentX, (int)contentY, (int)contentWidth, (int)contentHeight);
                    string fileName = System.IO.Path.Combine(mainWnd.TempPath, "snapshot_" + DateTime.Now.ToString("HH_mm_ss_ffff") + ".jpeg");

                    using (Stream stream = new FileStream(fileName, FileMode.Create))
                    {
                        JpegBitmapEncoder jpegEncoder = new JpegBitmapEncoder();
                        jpegEncoder.QualityLevel = 100;
                        jpegEncoder.Frames.Add(BitmapFrame.Create(bmpSource));
                        jpegEncoder.Save(stream);
                        stream.Flush();
                    }
Und version 2:
Code:
BitmapSource bmpSource = Snapshot.TakeSnapshot((int)contentX, (int)contentY, (int)contentWidth, (int)contentHeight);
                    string fileName = System.IO.Path.Combine(mainWnd.TempPath, "snapshot_" + DateTime.Now.ToString("HH_mm_ss_ffff") + ".jpeg");

                    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
                    Stream stream = new FileStream(fileName, FileMode.Create);
                    MemoryStream memoryStream = new MemoryStream();
                    BitmapImage bImg = new BitmapImage();

                    encoder.Frames.Add(BitmapFrame.Create(bmpSource));
                    encoder.Save(memoryStream);
                    stream.Write(memoryStream.GetBuffer(), 0, (int)memoryStream.Length - 1);

                    bImg.BeginInit();
                    bImg.CacheOption = BitmapCacheOption.OnLoad;
                    bImg.StreamSource = new MemoryStream(memoryStream.ToArray());
                    bImg.EndInit();

                    memoryStream.Flush();
                    stream.Flush();

                    memoryStream.Close();
                    stream.Close();

                    // Use bImg as Thumbnail and fileName as temp-file-reference
Beide code beispiele funktionieren einwandfrei, jedoch wenn Ich die erstellte temporäre datei nach einer Weile löschen möchte, bekomme Ich gesagt das ein Prozess die datei gerade benutzt. Was genau mache Ich hier falsch? Google hat mich nur auf den 2. code schnippsel gebracht was bei mir das Problem jedoch nicht beseitigt..
Sobald mein program geschlossen wird, kann Ich die Datei auch manuell löschen also d.h. das kein anderes Programm auf die Datei zugreift, sondern nur das hauptprogramm womit die JPG Datei erstellt wird.

Danke falls sich jemand findet der mir weiterhelfen kann!

Frohe Weihnachten!
Legend
12/25/2014 13:55 qqdev#2
Was machst du denn mit der erstellten Datei? Ich denke, dass das Problem vielleicht gar nicht in diesem Code zu suchen ist, sondern woanders.
12/25/2014 14:44 Legend2007#3
Quote:
Originally Posted by qqdev View Post
Was machst du denn mit der erstellten Datei? Ich denke, dass das Problem vielleicht gar nicht in diesem Code zu suchen ist, sondern woanders.
Den Pfad zur temp datei, sowie die generierte BitmapImage werden einer klasse zugewiesen, welche später an einem custom control weitergegeben werden um eine kleine snapshot gallery dynamisch zu generieren.

Code:
mainWnd.AddSnapshot(new CSnapshotData()
                    {
                        TempFile = fileName,
                        Preview = bImg,
                        shotTaken = DateTime.Now
                    });
Letzendlich hat man dann die möglichkeit, per ContextMenu der einzelnen Snapshot-controls, diese dann zu löschen. Beim löschen wird nicht nur die angelegte CSnapshotData gelöscht, aber auch die angelegte temporäre Datei. Also an sich wird die temp datei nach dem erstellen überhaupt nicht mehr benutzt. Zwar kann man die datei auch direkt per ContextMenu öffnen (dank dem zugewiesenen pfad) aber mehr ist da nichts.

Edit: Hattest recht, qqdev. Habe einen kleinen Fehler in einer anderen funktion gemacht welches Ich garnicht bemerkt hatte.

Code:
private bool AddSnapshotToClipboard(CSnapshotData data)
        {
            try
            {
                BitmapImage bmp = new BitmapImage(new Uri(data.TempFile));
                Clipboard.SetDataObject(bmp, true);
            }
            catch (Exception)
            {
                return false;
            }

            return true;
        }
Hier wird die angelegte datei wieder in einem Stream geladen aber nicht mehr freigegeben.. Wobei Ich die BitmapImage aus CSnapshotData direkt aufrufen kann lol IntelliTrace von Visual Studio hat da schon seinen Zweck :D

Gruß
Legend
12/25/2014 18:15 Njahs#4
Versuch es mal mit der "[Only registered and activated users can see links. Click Here To Register...]" Methode.

Code:
bmpSource.Freeze();
Grüße
12/25/2014 19:23 Mostey#5
Quote:
Originally Posted by Njahs View Post
Versuch es mal mit der "[Only registered and activated users can see links. Click Here To Register...]" Methode.

Code:
bmpSource.Freeze();
Grüße
Das hat nichts mit dem Problem zutun, er vergisst einfach nur den Stream/die Bitmap zu disposen (freizugeben).