2010-01-24 15 views
5

मैं डब्ल्यूपीएफ के साथ शुरुआत कर रहा हूं और प्रौद्योगिकी से परिचित होने के लिए एक होम प्रोजेक्ट की कोशिश कर रहा हूं। मेरे पास एक साधारण रूप है जहां उपयोगकर्ता एक छवि फ़ाइल का चयन करता है, फिर मैं छवि के थंबनेल के साथ EXIF ​​डेटा प्रदर्शित करता हूं। यह ठीक काम कर रहा है, लेकिन जब मैं एक रॉ छवि फ़ाइल (~ 9 एमबी) का चयन करता हूं तो अंगूठे के भार के दौरान थोड़ी देर हो सकती है, इसलिए मैंने सोचा कि मैं पृष्ठभूमि कार्यकर्ता का उपयोग छवि को डीकोड करने के लिए कर सकता हूं और उपयोगकर्ता 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 फ़ाइलें लोड हो रहा है निम्नलिखित त्रुटि मिलती है (कैनन .CR2 फ़ाइलें सभी मैं तारीख को परीक्षण किया है है), कोड जेपीजी के लिए ठीक काम करता है। क्या यह रॉड फाइलों को प्रदर्शित करने की अनुमति देने के लिए स्थापित कैनन कोडेक के साथ एक मुद्दा हो सकता है?

आवेदन एक अंतरफलक है कि एक अलग थ्रेड के लिए मार्शल किया गया था बुलाया। (HRESULT से अपवाद: 0x8001010E (RPC_E_WRONG_THREAD))

उत्तर

8

कॉल फ्रीज() BitmapSource पर और आप इस समस्या के लिए नहीं होगा

+0

मैंने बिटमैप स्रोत मूल्य को सेट करने के बाद, मेरी DoWork विधि में फ्रीज() कॉल जोड़ा। मैं फिर RunWorker पूर्ण विधि में निम्न पंक्ति जोड़ता हूं: बिटमैप स्रोत xx = args.Result; जो मुझे पहले की तरह एक ही त्रुटि देता है। क्या मुझे कुछ भी याद आ रही है? मैंने डिस्पैचर का उपयोग करके कोई कोड निकाला है। – Fermin

+0

मैं एक डंबस था लेकिन अब एक अंतर है। त्रुटि, अद्यतन प्रश्न। – Fermin

+0

कई सालों बाद भी। आपका बहुत बहुत धन्यवाद। पूरे नेट पर यह देख रहा है – Kulpemovitz

2
(बर्फ़ीली सूत्रण प्रतिबंध से मुक्त हो जाता है, लेकिन वस्तु अपरिवर्तनीय बनाता है)

मेरे पास बिल्कुल नमूना समस्या थी और इसे हल करने के लिए भाग्यशाली था।

संक्षिप्त उत्तर: WriteableBitmap में लपेटें। यह थोड़ी सी कीमत पर आता है, आप।

Long answer

+0

मेरे मामले के लिए, यह एकमात्र समाधान था जो काम करता था। मुझे एक बिटमैप फ्रेम को ट्रांसफॉर्मेड बिटमैप में खिलाने की आवश्यकता थी। उस पर नियंत्रण नहीं था जिस पर बिटमैप फ्रेम बनाया गया था, जैसा कि यह एक लाइब्रेरी द्वारा प्रदान किया गया है (और बिटमैपफ्रेम की डिस्पैचर संपत्ति शून्य है)।CanFreeze संपत्ति से पूछताछ भी एक अपवाद का कारण बनता है। मेरे पास दो विकल्प थे: मेरा स्रोत स्रोत और अन्य के स्रोत कोड का बड़ा ओवरहाल, या लिखने योग्य बिटमैप का उपयोग करें। मान लीजिए कि मैंने कौन सा चुना ... – elgonzo