0

我正在开发一个需要一些图像处理的 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;
    }

这与我在此处找到的示例非常相似,但是该示例项目甚至无法加载,因此我尝试单独打开文件...我的代码是用于否定的方法,只是wb = new WriteableBitmap(bs);他的if (wb==null) { ... }.

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

我说的是WriteableBitmap因为我的否定方法使用一个作为输入,进行一些处理并输出它。(同类型,WriteableBitmap.

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

4

2 回答 2

2

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

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

null 告诉你ImagePanel.Source不是type ; 您的类型转换失败。这是意料之中的;选择器会给你一些只读的东西,因为只读图像的性能更高(如果 WinRT 知道图像的内容不会改变,它可以做一些优化)。只有当您明确创建一个时,您才会得到一个。WriteableBitmapWriteableBitmap

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

您确实需要一个WriteableBitmap来访问像素缓冲区,但您需要制作一个原始图像的副本。摆脱你的演员和if阻止,试试这个:

var imageToNegativate = new WriteableBitmap(ImagePanel.Source);
于 2012-12-30T18:29:03.590 回答
0

Joe 说您的代码有什么问题是正确的,但是虽然他的答案可能适用于 WPF - 他提到的构造函数在 WinRT/XAML 中确实不存在。事实上,没有办法从 BitmapImage 创建 WriteableBitmap,唯一的攻击方法是从 BitmapImage 的源创建 WriteableBitmap。

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

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

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

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

于 2012-12-31T07:26:26.793 回答