我是WPF的初学者,并尝试一个家庭项目来熟悉该技术。我有一个简单的表单,用户选择图像文件,然后显示Exif数据以及图像的缩略图。这很好,但是当我选择一个原始图像文件(〜9 MB)时,拇指加载时可能会稍有延迟,因此我认为我可以使用后台工作人员来解码图像,并且用户可以查看EXIF数据,然后将图像解码后显示。

BitMapsource对象在后台工作人员陶库方法中声明:

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

我遇到的问题是,当我尝试在runworkercomplet的方法中设置图像控件的来源时,我会收到错误,因为该对象由另一个线程所有。

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。这是我安装的佳能编解码器以允许我显示原始文件的问题吗?

该应用程序称为一个接口,该界面已为另一个线程编辑。 (Hresult的例外:0x8001010E(rpc_e_wrong_thread))

有帮助吗?

解决方案

在BitMapsource上调用freeze(),您将不会遇到此问题(冻结会摆脱螺纹限制,但使对象不可变)

其他提示

我完全有样本问题,很幸运能解决它。

简短答案:包裹 WriteableBitmap. 。那是一个小的代价,你。

长答案.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top