قم بتحميل Bitmapsource وحفظ باستخدام نفس الاسم في WPF -> IoException

StackOverflow https://stackoverflow.com/questions/542217

  •  23-08-2019
  •  | 
  •  

سؤال

عندما أحاول حفظ bitmapsource التي قمت بتحميلها في وقت سابق، System.IO.IOException يتم إلقاؤه تفيد بأن عملية أخرى تصل إلى هذا الملف ولا يمكن فتحه FileStream.

إذا قمت فقط بحفظ التحميل في وقت سابق، فإن كل شيء يعمل بشكل جيد.

رمز التحميل:

BitmapImage image = new BitmapImage();

image.BeginInit();
image.UriSource = uri;

if (decodePixelWidth > 0)
image.DecodePixelWidth = decodePixelWidth;

image.EndInit();

رمز الادخار:

using (FileStream fileStream = new FileStream(Directory + "\\" + FileName + ".jpg", FileMode.Create))
{
    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create((BitmapImage)image));
    encoder.QualityLevel = 100;
    encoder.Save(fileStream);
}

يبدو أنه بعد تحميل بيانات الصورة، لا يزال الملف مغلقا لا يمكن الكتابة فوقه في حين أن التطبيق الذي فتحه لا يزال قيد التشغيل. هل توجد أية أفكار لحل هذا؟ شكرا جزيلا لأي حلول.

هل كانت مفيدة؟

المحلول

مستوحاة من التعليقات التي حصلت عليها في هذه المسألة، حل المشكلة من خلال قراءة جميع البايتات في موعد للذاكرة واستخدامها كإرامية BitmapImage's Sreamsource.

هذا يعمل تماما:

if (File.Exists(filePath))
{
    MemoryStream memoryStream = new MemoryStream();

    byte[] fileBytes = File.ReadAllBytes(filePath);
    memoryStream.Write(fileBytes, 0, fileBytes.Length);
    memoryStream.Position = 0;

    image.BeginInit();
    image.StreamSource = memoryStream;

    if (decodePixelWidth > 0)
        image.DecodePixelWidth = decodePixelWidth;

    image.EndInit();
}

نصائح أخرى

هنا هو حل آخر، بناء على رمز التحميل الأصلي:

var image = new BitmapImage();
image.BeginInit();

// overwrite cache if already exists, to refresh image
image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
// load into memory and unlock file
image.CacheOption = BitmapCacheOption.OnLoad;

image.UriSource = uri;
if (decodePixelWidth > 0) image.DecodePixelWidth = decodePixelWidth;
image.EndInit();

أضف السطر التالي إلى رمز التحميل الخاص بك:

image.CacheOption = BitmapCacheOption.OnLoad;

سيتم تحميل هذا فتح الملف، وقراءته في الذاكرة، وإغلاق كل ذلك خلال image.endinit.. وبعد الافتراضي bitmapcachoodtion.default. لديه السلوك الغريب لفتح الملف، وقراءته في الذاكرة، ولكن ليس بإغلاقه بعد image.endinit..

الآن لست متأكدا مما إذا كان من الممكن تطبيق ذلك على BitmapImage ولكن كان لدي مشكلة مماثلة للغاية مع حفظ صورة معدلة إلى الملف الأصلي في GDI + هنا

تقوم طريقة تحميل الصورة من الملف باستمرار قفل مفتوحا على الملف حتى يتم التخلص من كائن الصورة.

ربما هو نفس الشيء مع bitmapimage.urisource. دون اللعب حولها، هل يمكنك نسخ الصورة في الذاكرة وتخلص الأصلي، ثم فتح الملف؟

وضع cacheoption إلى bitmapcachooption.Onload، لن يحل مشكلتك. أعتقد أن هناك خطأ، لكن كان لدي نفس المشكلة. أخيرا، قمت بتحميل صورتي إلى دفق الذاكرة والتخلص من BitmapImage قبل حفظ الصورة بالملف.

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