【问题标题】:MVVM Writeablebitmap Image processingMVVM Writeablebitmap 图像处理
【发布时间】:2016-06-07 10:58:12
【问题描述】:

这个想法是处理加载的图像。我首先想以这种方式处理它,即有一条白/黑线穿过图像。 实际问题是,一个新线程(用于 Thread.Sleep)在处理时冻结了整个 UI。当我尝试使用 Dispatcher 时,图像不会更新。

所以我得到了一个处理类:

public WriteableBitmap GetProcessedPicture(int i)
        {
            WriteableBitmap wb = image.image;

            Process(ref wb, i);

            return wb;
        }

        private void Process(ref WriteableBitmap wb, int j)
        {
            int stride = wb.PixelWidth * (wb.Format.BitsPerPixel + 7) / 8;

            byte[] data = new byte[stride * wb.PixelHeight];

            for (int i = 0; i < data.Length; i++) data[i] = 255;

//just to see some changes
            wb.WritePixels(new Int32Rect(j, 0, 100, 100), data, stride, 0);

        }

MainViewModel 类(我使用的是 MVVM 灯):

public void Start_Click()
        {
                        Application.Current.Dispatcher.BeginInvoke(new Action(() =>
        {
            for (int i = 0; i < 100; i++)
            {
                ImageSource = processingClass.GetProcessedPicture(i);

                Thread.Sleep(100);
            }
        }));

            };

感谢您的帮助。

【问题讨论】:

    标签: mvvm writeablebitmap


    【解决方案1】:

    我不认为 ImageSource(假设它绑定到 Image.Source)接受 WriteableBitmap。您必须先将其转换为BitmapImage

    稍微调整一下你的代码,我会这样做:

    public void Start_Click()
    {
        var t = new Task(() =>
        {
            for (var i = 0; i < 100; i++)
            {
                var writeablebitmap = processingClass.GetProcessedPicture(i);
                var bitmapImage = processingClass.ConvertToBitmapImage(writeablebitmap);
    
                Application.Current.Dispatcher.BeginInvoke(new Action(() =>
                {
                    ImageSource = bitmapImage;
                }));
    
                Thread.Sleep(100);
            }
        });
        t.Start();
    }
    

    这样,您不会因图像处理而停止 UI 线程,但仍会在 UI 线程上更新图像。

    关于将您的WriteableBitmap 转换为BitmapImage,互联网上有大量可用资源,例如this one

    【讨论】:

    • 是的,ImageSource 是 Image.Source,但它接受 WriteableBitmap 时我初始化它没有问题。但是我尝试了你的代码,它给我同样的InvalidOperationException,我得到了更好的结果。
    • 您是否在 UI 线程上创建了 WriteableBitmap?否则,这可能会解释您的InvalidOperationException。您可能还想阅读msdn.microsoft.com/en-us/library/… 的备注,以确保您在线程方面做得正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2018-04-03
    相关资源
    最近更新 更多