Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > .NET Languages
You last visited: Today at 20:59

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



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

Discussion on [WPF C#]Erstellte Datei aus BitmapSource bleibt vom prozess gesperrt within the .NET Languages forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 121
Join Date: Feb 2008
Posts: 654
Received Thanks: 411
[WPF C#]Erstellte Datei aus BitmapSource bleibt vom prozess gesperrt

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
Legend2007 is offline  
Old 12/25/2014, 13:55   #2
 
elite*gold: 8
Join Date: Sep 2014
Posts: 625
Received Thanks: 178
Was machst du denn mit der erstellten Datei? Ich denke, dass das Problem vielleicht gar nicht in diesem Code zu suchen ist, sondern woanders.
qqdev is offline  
Thanks
1 User
Old 12/25/2014, 14:44   #3
 
elite*gold: 121
Join Date: Feb 2008
Posts: 654
Received Thanks: 411
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

Gruß
Legend
Legend2007 is offline  
Old 12/25/2014, 18:15   #4

 
Njahs's Avatar
 
elite*gold: 574
Join Date: Nov 2010
Posts: 2,498
Received Thanks: 726
Versuch es mal mit der "" Methode.

Code:
bmpSource.Freeze();
Grüße
Njahs is offline  
Old 12/25/2014, 19:23   #5


 
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
Quote:
Originally Posted by Njahs View Post
Versuch es mal mit der "" Methode.

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


Similar Threads Similar Threads
Der Prozess kann nicht auf die Datei * zugreifen, weil sie von einem anderen Prozess
05/07/2013 - .NET Languages - 11 Replies
Moin, Ich bekomme immer einen Fehler, wenn ich versuche eine Datei zu bearbeiten und zwar folgenden: Die Meldung ist eig. recht eindeutig aber ich finde den Fehler einfach nicht. In meinen Funktionen wird die Datei auch IMMER geschlossen. Hier die Funktion, bei der der fehler auftritt.
[VB.NET] Datei wird bereits von anderem Prozess verwendet - welchem?
02/22/2013 - .NET Languages - 0 Replies
Hab hier folgendes Problem mit meinem Code: Dim text As String = "" Dim sr As System.IO.StreamWriter sr = My.Computer.FileSystem.OpenTextFileWriter(My.Compu ter.FileSystem.SpecialDirectories.MyDocuments & "\maxasoft\Vokabeltrainer\Liste1.txt", True) For Each item As ListViewItem In ListView1.Items text += item.Text & ":" text += item.SubItems(0).Text & vbCrLf Next
In welcher datei sind die verbotenen Wörter gesperrt?
07/22/2010 - Metin2 Private Server - 4 Replies
In welcher datei sind die verbotenen Wörter wie z.B ( will nun keins nennen aber ihr wisst was ich meine ) gesperrt? Ist das Client modding oder Server Side? Mfg Bunny :handsdown::handsdown:
[Visual C#]Datei wird immer von einem Prozess verwendet..
05/24/2010 - .NET Languages - 2 Replies
Also ich habe jetzt meinen Patcher fertig ;) Mein Problem: Der Patcher liest die die version.txt aus und dann später ersetzt er diese. Aber jedesmal wird die Datei von einem anderen Prozess verwendet. Aber sie ist mit keinem anderen Progamm geöffnet... Vlt kann sich das mal jm anschauen ;) Bin noch totaler Anfänger also net erschrecken ;)



All times are GMT +1. The time now is 21:02.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.