2011-06-21 13 views
13

करता मैं का उपयोग करें:BitmapImage ताला फ़ाइल

Dim bmi As New BitmapImage(New Uri(fiInfo.FullName, UriKind.Absolute)) 
bmi.CacheOption = BitmapCacheOption.OnLoad 

इस Use OnLoad नहीं करता है और फ़ाइल अभी भी हार्डडिस्क पर अधिलेखित करने के लिए बंद है। किसी भी विचार को अनलॉक करने के लिए कैसे?

Dim bmi As New BitmapImage() 
bmi.BeginInit() 
bmi.CacheOption = BitmapCacheOption.OnLoad 
bmi.UriSource = New Uri(fiInfo.FullName, UriKind.Absolute) 
bmi.EndInit() 
+0

यहां देखने के लिए स्मृति समस्याएं भी हैं। Http://stackoverflow.com/questions/6271891/net-memory-issues-loading-40-images-memory-not-reclaimed-potentially-due-to-l/6271982#6271982 – Oppositional

+0

धन्यवाद। क्या आप चाहते हैं कि मैं अपने लिंक के साथ वास्तव में संभव नहीं होने पर सभी फाइलों को कैश करने की कोशिश न करें? – Nasenbaer

उत्तर

30

के रूप में सवाल आप लिंक में दिखाया गया है, तो आप, BeginInit और EndInit कॉल करने के लिए की तरह तो साथ ही साथ UriSource गुण सेट आवश्यकता होगी और एक MemoryStream साथ यह पुनर्लेखन:

MemoryStream ms = new MemoryStream(); 
BitmapImage bi = new BitmapImage(); 
byte[] bytArray = File.ReadAllBytes(@"test.jpg"); 
ms.Write(bytArray, 0, bytArray.Length);ms.Position = 0; 
bi.BeginInit(); 
bi.StreamSource = ms; 
bi.EndInit(); 
image.Source = bi; 
+0

सी # के बजाय मेरे कीवर्ड और वीबी के बारे में भी आपके त्वरित उत्तर के लिए धन्यवाद! अब महान काम करता है! – Nasenbaer

+0

क्या XAML का सख्ती से इसका उपयोग करने का कोई तरीका है। – TrustyCoder

7

फ़ाइल से BitmapImage पढ़ें:

सादर

+0

आपके त्वरित उत्तर के लिए धन्यवाद Navid। मैं देखता हूं कि जहां तक ​​मैं देखता हूं उस तरह से काम करेगा। मैं 'bmi.EndInit()' मेथोड + 'ऑनलोड ' का उपयोग कर रहा हूं जो अब मेरे मामले में थोड़ा सा सरल है। – Nasenbaer

+0

अब, जो मेमोरीस्ट्रीम ऑब्जेक्ट इंस्टेंस का मालिक है और इसे निपटाने के लिए ज़िम्मेदार है? – Henrik

+1

वैसे भी ... फ़ाइल को अनलॉक करने और इसे हटाने के लिए कैसे? –

0
BitmapFrame.Create(new Uri(filePath), BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
2

मैं के रूप में किया था

public static BitmapImage BitmapFromUri(Uri source) 
    { 
     var bitmap = new BitmapImage(); 
     bitmap.BeginInit(); 
     bitmap.UriSource = source; 
     bitmap.CacheOption = BitmapCacheOption.OnLoad; 
     bitmap.EndInit(); 
     return bitmap; 
    } 

आप इस तरह की छवि को खोल सकते हैं (यह एक जवाब here के निजीकरण है):

BitmapImage bimg = BitmapFromUri(new Uri(some_URI)); 

और यह यह लोड करने के बाद immediatly छवि विज्ञप्ति imilar समस्या है और मैं इस पद्धति का उपयोग हल ।

आशा है कि इससे मदद मिल सकती है!