حذف صورة تم استخدامها بواسطة عنصر تحكم WPF
-
19-09-2019 - |
سؤال
أرغب في ربط صورة إلى نوع من التحكم في حذفه لاحقا.
path = @"c:\somePath\somePic.jpg"
FileInfo fi = new FileInfo(path);
Uri uri = new Uri(fi.FullName, UriKind.Absolute);
var img = new System.Windows.Controls.Image();
img.Source = new BitmapImage(uri);
الآن بعد هذا الرمز أود حذف الملف:
fi.Delete();
لكن لا يمكنني القيام بذلك منذ استخدام الصورة الآن. بين جزء التعليمات البرمجية 1 EN 2 ماذا يمكنني أن أفعل لإطلاق سراحه؟
المحلول
انسخ الصورة إلى موعد الذاكرة قبل إعطاءها للمؤسسات التي يجب أن تبدو مثل هذا
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 30;
bi.StreamSource = byteStream;
bi.EndInit();
حيث bytestream هي نسخة من الملف في موعد الذاكرة
ايضا هذه يمكن أن تكون مفيدة
نصائح أخرى
يمكنك استخدام MemoryStream
ولكن هذا في الواقع يضيع الذاكرة لأن نسختين منفصلتين من بيانات الصورة النقطية تبقى في ذاكرة الوصول العشوائي: عند تحميل MemoryStream
يمكنك إجراء نسخة واحدة، وعندما يتم فك تشفير الصورة النقطية نسخة أخرى. مشكلة أخرى مع استخدام MemoryStream
بهذه الطريقة هو أنك تجاوز ذاكرة التخزين المؤقت.
أفضل طريقة للقيام بذلك هي القراءة مباشرة من الملف باستخدام bitmapca_optionptions.onload:
path = @"c:\somePath\somePic.jpg"
var source = new BitmapImage();
source.BeginInit();
source.UriSource = new Uri(path, UriKind.RelativeOrAbsolute);
source.CacheOption = BitmapCacheOption.OnLoad;
source.EndInit(); // Required for full initialization to complete at this time
var img = new System.Windows.Controls.Image { Source = source };
هذا الحل فعال وبسيط أيضا.
ملاحظة: إذا كنت ترغب بالفعل في تجاوز ذاكرة التخزين المؤقت، على سبيل المثال لأن الصورة قد تتغير على القرص، يجب عليك أيضا ضبطها CreateOption = BitmapCreateOption.IgnoreImageCache
. وبعد ولكن حتى في هذه الحالة يتفوق هذا الحل على MemoryStream
الحل لأنه لا يبقي نسختين من بيانات الصورة في ذاكرة الوصول العشوائي.