سؤال

أرغب في ربط صورة إلى نوع من التحكم في حذفه لاحقا.

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 الحل لأنه لا يبقي نسختين من بيانات الصورة في ذاكرة الوصول العشوائي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top