سؤال

أنا مبتدئ في WPF وأحاول تنفيذ مشروع منزلي للتعرف على التكنولوجيا.لدي نموذج بسيط حيث يقوم المستخدم بتحديد ملف صورة، ثم أقوم بعرض بيانات EXIF ​​مع صورة مصغرة للصورة.يعمل هذا بشكل جيد ولكن عندما أقوم بتحديد ملف صورة RAW (حوالي 9 ميجابايت) يمكن أن يكون هناك تأخير بسيط أثناء تحميل الإبهام، لذلك اعتقدت أنه يمكنني استخدام تطبيق BackgroundWorker لفك تشفير الصورة ويمكن للمستخدم عرض بيانات EXIF، ثم عندما يتم فك تشفير الصورة يتم عرضها.

تم الإعلان عن كائن BitmapSource في أسلوب BackgroundWorkers DoWork:

worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
    string filePath = args.Argument as string;

    BitmapDecoder bmpDecoder = BitmapDecoder.Create(new Uri(filePath), BitmapCreateOptions.None, BitmapCacheOption.None);
    BitmapSource bmpSource = bmpDecoder.Frames[0];
    bmpSource.Freeze(); //As suggested by Paul Betts

    args.Result = bmpSource;
};

المشكلة التي أواجهها هي عندما أحاول تعيين مصدر عنصر التحكم في الصورة الخاص بي في طريقة RunWorkerCompleted، أتلقى خطأً لأن الكائن مملوك لسلسلة رسائل أخرى.

worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
    imgThumb.Source = args.Result as BitmapSource;
};

حاولت استخدام imgThumb.Dispatcher.BeginInvoke() طريقة لتعيين المصدر ولكن هذا لم ينجح أيضًا، أعتقد أن السبب هو أنه args.Result التي يملكها موضوع آخر، وليس imgThumb؟كيف يمكنني الالتفاف حول هذا؟

ربما كنت قد قمت بترميز المرسل بشكل خاطئ (ما يلي من الذاكرة، لقد قمت بحذف ما كان لدي).

imgThumb.Dispatcher.Invoke(new Action<BitmapSource>(
    delegate(BitmapSource src)
    {
        imgThumb.Source = src;
    }
), bmpSource);

أي اقتراحات أو أفكار هي موضع ترحيب.

تحديث

قمت بتغيير طريقة DoWork الخاصة بي لاستخدام BitmapCreateOptions.None بدلاً من .DelayCreation ولكني الآن أحصل على الخطأ التالي عند تحميل ملفات RAW (ملفات Canon .CR2 هي كل ما قمت باختباره حتى الآن)، ويعمل الرمز بشكل جيد مع ملفات jpg.هل يمكن أن تكون هذه مشكلة في برنامج Canon Codec الذي قمت بتثبيته للسماح لي بعرض ملفات RAW؟

يسمى التطبيق واجهة تم تنظيمها لخيط مختلف.(استثناء من HRESULT:0x8001010E (RPC_E_WRONG_THREAD))

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

المحلول

اتصل بـ Freeze() على BitmapSource ولن تواجه هذه المشكلة (يتخلص التجميد من قيود الترابط، ولكنه يجعل الكائن غير قابل للتغيير)

نصائح أخرى

لقد واجهت مشكلة العينة بالضبط وكنت محظوظًا بحلها.

اجابة قصيرة:التفاف في WriteableBitmap.وهذا يأتي بسعر قليل، أنت.

اجابة طويلة.

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