1

我想使用一个框架元素(如面板)作为图像(使用诺基亚图像 SDK)。我想不是在图像上而是在 FrameworkElement 上应用效果。

我一直在努力尝试将 FrameworkElement 用作 writeableBitmap,然后将其用作我的 FilterEffect 的流。

这是我所做的:

    private async void testCartoon_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {

       //the panel I want as an Image
       var rootElement = ContentPanel as FrameworkElement; 

       WriteableBitmap myWB = new WriteableBitmap(rootElement,null);

       byte[] bytes =  myWB.ToByteArray();

       MemoryStream stream = new MemoryStream();

       await stream.WriteAsync(myWB.ToByteArray(),0,bytes.Count());

       stream.Seek(0, SeekOrigin.Begin);

       var backgroundSource = new StreamImageSource(stream);

       var filterEffect = new FilterEffect(backgroundSource);

        CartoonFilter cartoonFilter = new CartoonFilter();



        filterEffect.Filters = new[] { cartoonFilter };

        var renderer = new WriteableBitmapRenderer(filterEffect, _cartoonImageBitmap);

        _cartoonImageBitmap = await renderer.RenderAsync();

        ImageCartoon.Source = _cartoonImageBitmap;
  }

CartoonFilter 是 NokiaImagingSDK 过滤器之一。

我像这样定义了我的 _cartoonImageBitmap:

  _cartoonImageBitmap = new WriteableBitmap((int)ImageCartoon.Width, (int)ImageCartoon.Height);

和 xaml 中的 ImageCartoon :

   <Image x:Name="ImageCartoon" Width="456" Height="240" Grid.Row="1" ></Image>

我得到了例外:“值不在预期范围内”在行

     _cartoonImageBitmap = await renderer.RenderAsync();

你知道为什么吗?

有没有更好的方法从 FrameworkElement 中获取流?

(我知道我可以在读取之前将 writeableBitmap 保存到文件存储中,但我想避免保存图像以提高性能)。

非常感谢你的帮助。

4

2 回答 2

0

这只是一种预感,但仍然如此。可能值得一试。你什么时候创建你的_cartoonImageBitmap?看起来您正在构造函数中执行此操作。

问题可能是您的行在_cartoonImageBitmap = new WriteableBitmap((int)ImageCartoon.Width, (int)ImageCartoon.Height);ImageCartoon 使用其最终大小初始化之前执行。在构造函数中,它的大小仍应为 (0, 0)。

如果目标源的大小为 (0, 0),这是您将从 Renderer 获得的错误,因此我认为值得尝试创建具有静态大小的 _cartoonImageBitmap,例如 (500, 500)。

试一试并报告!

于 2014-01-27T07:58:21.337 回答
0

我找到了解决方案:问题来自 WriteAsync 方法。这是我所做的:

  private async void testCartoon_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{

   //the panel I want as an Image
   var rootElement = ContentPanel as FrameworkElement; 

   WriteableBitmap myWB = new WriteableBitmap((int)rootElement.ActualWidth,    (int)rootElement.ActualHeight);
   myWB.Render(rootElement, new MatrixTransform());
   myWB.Invalidate();


    using (var stream = new MemoryStream())
    {

      myWB.SaveJpeg(stream, myWB.PixelWidth, myWB.PixelHeight, 0, 100);

      stream.Seek(0, SeekOrigin.Begin);

      var backgroundSource = new StreamImageSource(stream);

      var filterEffect = new FilterEffect(backgroundSource);

      CartoonFilter cartoonFilter = new CartoonFilter();

      filterEffect.Filters = new[] { cartoonFilter };

      var renderer = new WriteableBitmapRenderer(filterEffect, _cartoonImageBitmap);

      _cartoonImageBitmap = await renderer.RenderAsync();

      ImageCartoon.Source = _cartoonImageBitmap;
    }

}

我刚刚用 SaveJpeg 进行了更改,它现在可以工作了。谢谢你的帮助。

于 2014-01-27T10:57:48.580 回答