WinRT中的简单图像处理

本文关键字:图像处理 简单 WinRT | 更新日期: 2023-09-27 17:49:55

我正在开发一个需要一些图像处理的WinRT应用程序。到目前为止,我已经做了一些类似的事情,但在Java中,我也想在WinRT应用程序中做一些简单的事情。。。但我似乎无法用API管理我的方式。。。

长话短说,我在xaml中的页面上有一个image,它通过文件选择器获取图像。然后,当我点击"否定"按钮时,图像应该会被否定。

现在,否定按钮的方法,我想看起来像这样:

private void OnNegativateButtonClick(object sender, RoutedEventArgs e)
    {
        var imageToNegativate = ImagePanel.Source as WriteableBitmap ;
        if (imageToNegativate == null) //Actually is ALWAYS null :(
        {
            //Wrong code here...
            var bitmapSource = ImagePanel.Source as BitmapSource;
            imageToNegativate = new WriteableBitmap(imageToNegativate.PixelWidth, imageToNegativate.PixelHeight);
        }
        imageToNegativate = ImageUtil.Negativate(imageToNegativate);
        ImagePanel.Source = imageToNegativate;
    }

这与我在这里找到的这个示例非常相似,但该示例项目甚至无法加载,所以我尝试单独打开文件。。。我的代码是否定的方法——只有他的if (wb==null) { ... }中的wb = new WriteableBitmap(bs);有问题。

image中获取可写位图,进行一些像素操作,然后使用新的可写位图设置图像源的方法是什么。。。

我之所以说WriteableBitmap,是因为我的否定方法使用一个作为输入,进行一些处理并输出它

非常感谢您的任何建议或帮助,谢谢!

WinRT中的简单图像处理

第一个问题是这些代码行:

var imageToNegativate = ImagePanel.Source as WriteableBitmap ;
if (imageToNegativate == null) //Actually is ALWAYS null :(

null告诉您ImagePanel.Source而不是类型为WriteableBitmap;你的打字失败了。这是意料之中的事;picker会给你一些只读的东西,因为只读图像更具性能(如果WinRT知道图像的内容不会改变,它可以做一些优化(。只有在显式创建WriteableBitmap时,才能获得CCD_9。

if块的主体也没有多大意义——你试图创建一个与原始图像大小相同的新的空WriteableBitmap,然后你试图在空图像上进行反向视频即使你走了那么远,你也只会得到另一张空照片。您没有采取任何措施来保留原始图像中的像素。

您确实需要一个WriteableBitmap来访问像素缓冲区,但您需要制作一个原始图像的副本。去掉你的演员阵容和if块,试试这个:

var imageToNegativate = new WriteableBitmap(ImagePanel.Source);

Joe说你的代码出了什么问题是对的,但尽管他的答案可能在WPF中有效,但他提到的构造函数在WinRT/XAML中确实不存在。事实上,没有办法从BitmapImage创建WriteableBitmap,攻击它的唯一方法是从您的BitmapImage源创建Writeable位图。

一种方法是创建一个新的1x1大小的WriteableBitmap,然后在BitmapImage的源上使用其SetSource方法。由于BitmapImage.UriSource属性是一个Uri,而WriteableBitmap。SetSource((需要一个Stream,因此您需要使用它来查找或下载实际的图像文件,并打开一个流来读取它。我的工具包有一些扩展方法(WriteableBitmap.FromBitmapImage(((可以帮助你使用它,以防你的图像来自你的应用程序包,你可以很容易地将它扩展到也可以使用下载的图像。

问题是——这样会导致效率低下——一个是你需要打开并解码文件两次(对于ARM设备上的大图像来说,这可能会很慢——已经做到了(,第二,如果文件来自网络,您可能需要重新下载该文件;第三,如果将关联Image控件的CacheMode设置为BitmapCache,WinRT/XAML中存在导致BitmapImage的UriSource属性变为null的错误,因此您可能需要单独跟踪源。

在许多方面,最好的解决方案是确保从一开始就将源图像作为WriteableBitmap打开,这样,如果您想更改它,甚至不必创建另一个位图。在您的情况下,用户选择了图像文件,因此只有一个文件,并且之后似乎有很大的机会进行处理,因此将其作为可写位图打开听起来是正确的做法。

也许即使你想保留图像的原始版本和处理版本,创建一个相同大小的新WriteableBitmap并复制原始图像的像素可能比解码一个大图像文件两次更快(尤其是在ARM设备上(。