2010-01-24 77 views
5

我是WPF的初学者,并试图通过家庭项目熟悉该技术。我有一个简单的表单,用户选择一个图像文件,然后显示EXIF数据以及图像的缩略图。这工作正常,但是当我选择一个RAW图像文件(〜9 MB)时,可能会在拇指加载时出现轻微延迟,所以我想我可以使用BackgroundWorker来解码图像,用户可以查看EXIF数据,然后当图像被解码时,它被显示。WPF/BackgroundWorker和BitmapSource问题

的对象的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?我怎样才能解决这个问题?

这可能是我编码我的Dispatcher错误(下面是从内存中,我删除了我的)。

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

任何建议或想法,欢迎。

更新

改变了我的DoWork方法使用BitmapCreateOptions.None而非.DelayCreation但现在我加载RAW文件时出现以下错误(佳能.CR2文件是我已经测试为准),将代码对jpg的工作正常。这可能是我安装的Canon Codec允许我显示RAW文件的问题吗?

的应用程序调用的接口 这是编组为不同 线程。 (异常来自HRESULT: 0x8001010E(RPC_E_WRONG_THREAD))上的BitmapSource

回答

8

呼叫冻结(),你不会有这样的问题(冻结摆脱的线程限制,但使对象不可变)

+0

我在设置BitmapSource值后,在我的DoWork方法中添加了Freeze()调用。然后,我将以下行添加到RunWorkerCompleted方法:BitmapSource xx = args.Result;这给了我和以前一样的错误。我错过了什么明显的?我使用Dispatcher取出了任何代码。 – Fermin 2010-01-24 21:05:03

+0

我是一个笨蛋,但现在有一个差异。错误,更新的问题。 – Fermin 2010-01-24 21:22:32

+0

即使多年。非常感谢你。一直在寻找这个网络 – Kulpemovitz 2017-01-09 11:08:41

2

我有完全的示例问题,很幸运解决它。

简短的回答:换行WriteableBitmap。这是一个小价格,你。

Long answer

+0

对我来说,这是唯一的解决方案。我需要将一个BitmapFrame提供给TransformedBitmap。无法控制BitmapFrame创建的线程,因为它是由库提供的(并且BitmapFrame的Dispatcher属性为空)。即使查询CanFreeze属性也会导致异常。我有两个选择:对我的源代码和其他的主要代码进行重大修改,或使用WriteableBitmap。猜猜我选择了哪一个... – elgonzo 2013-11-21 00:14:18