2010-01-24 17 views
5

WPF ile yeni başlayan ve teknolojiye aşina olmak için bir ev projesi deniyorum. Kullanıcının bir görüntü dosyasını seçtiği basit bir formum var, daha sonra EXIF ​​verilerini resmin küçük resmi ile birlikte görüntüliyorum. Bu iyi çalışıyor ama bir RAW görüntü dosyası (~ 9 MB) seçtiğimde başparmak yüklendiğinde hafif bir gecikme olabilir, bu yüzden görüntüyü çözmek için BackgroundWorker'ı kullanabileceğimi düşündüm ve kullanıcı EXIF ​​verilerini görüntüleyebilir, sonra görüntü çözüldüğünde görüntülenir.WPF/BackgroundWorker ve BitmapSource problemi

BitmapSource nesne BackgroundWorkers DoWork yönteminde ilan edilir:

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; 
}; 

ben bir hata alırsınız RunWorkerCompleted yönteminde benim Görüntü kontrolünün kaynağını ayarlamak çalıştığımda içine çalıştırıyorum sorundur Nesne başka bir iş parçacığına ait olduğu için.

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

Kaynağını ayarlamak için imgThumb.Dispatcher.BeginInvoke() yöntemi kullanarak çalıştı ama bu da işe yaramadı, ben imgThumb başka bir iş parçacığı tarafından sahip olunan args.Result, ve değil çünkü sanırım? Bunu nasıl başarabilirim?

Bu benim Dispatcher'ımı yanlış kodluyor olabilir (aşağıdaki bellekten, sahip olduğum şeyi sildim).

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

Herhangi bir öneri veya fikir bekliyoruz.

Güncelleme

BitmapCreateOptions.None yerine .DelayCreation kullanmak benim DoWork yöntemini değiştirdi ancak RAW dosyalarını yüklerken şimdi aşağıdaki hatayı alıyorum (Canon .CR2 dosyaları bugüne kadar test ettik hepsi), kod jpg'ler için iyi çalışıyor. RAW dosyalarını görüntülemem için izin verdiğim Canon Codec ile bu bir sorun olabilir mi?

uygulaması, farklı parçacığı için sıraya konan bir arayüz adı. (HRESULT özel durum: 0x8001010E (RPC_E_WRONG_THREAD)) BitmapSource üzerinde

cevap

8

Çağrı Freeze() ve bu sorun olmayacak

+0

BitmapSource değerini ayarladıktan hemen sonra DoWork yöntemimde Freeze() çağrısını ekledim. Sonra aşağıdaki satırı RunWorkerCompleted yöntemine ekleyin: BitmapSource xx = args.Result; Bu bana önceki gibi aynı hatayı veriyor. Belli bir şey eksik miyim? Dispatcher'ı kullanarak herhangi bir kod çıkardım. – Fermin

+0

Bir aptallık yapıyorum ama şimdi bir fark var. hata, güncellenmiş soru. – Fermin

+0

Yıllar sonra bile. ÇOK TEŞEKKÜR EDERİM. Net – Kulpemovitz

2
(Donma parçacığı kısıtlamaların kurtulur ama değiştirilemez nesne yapar)

Tam olarak örnek problemim vardı ve bunu çözmek için şanslıydım.

Kısa yanıt: WriteableBitmap içinde sarın. Bu biraz fiyat geliyor, sen.

Long answer.

+0

tüm bu için arıyorum Benim durum için, bu çalıştı sadece bir çözüm oldu. BitmapFrame'i bir TransformedBitmap'e beslemem gerekiyordu. BitmapFrame'in hangi kitaplık üzerinde oluşturulduğu üzerinde denetim bulunmadı (ve BitmapFrame'in Dispatcher özelliği boştur).CanFreeze özelliğini sorgulamak bile bir istisna oluşturdu. İki seçeneğim vardı: benim ve diğer kaynak kodlarının büyük revizyonu veya WriteableBitmap kullanımı. Hangisini seçtiğimi tahmin et. – elgonzo