1

我想使用FrameworkElement(例如Panel)作为Image(使用Nokia Image SDK)。 我想申请一个效果不是在图像上,而是在FrameworkElement上。将FrameworkElement转换为Stream而不保存到文件

我一直在努力尝试使用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); 

和ImageCartoon在XAML:

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

我得到异常:在line

“值没有在预期范围内”
 _cartoonImageBitmap = await renderer.RenderAsync(); 

你知道为什么吗?

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

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

非常感谢您的帮助。

回答

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,它现在工作。谢谢你的帮助。

+0

我很高兴你找到了解决方案! –

0

这只是一个预感,但仍然。这可能值得一试。你什么时候创建你的_cartoonImageBitmap?它看起来像你正在做一个构造函数。

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

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

试试看!

+0

感谢您的帮助,但不幸的是并非如此。我检查和_cartoonImageBitmap已经有一个大小。我可能会看到两个问题:第一:byte []字节满了0.当它应该包含其他值时。其次:也许我的WriteAsync没有完成,当我尝试使用流。 –

+0

啊,喂。那么既然你等待WriteAsync它应该完成。我会专注于为什么字节数组只包含零。出于好奇,你想达到什么目的? –

+0

是的,它是writeAsync。我刚找到解决方案,我会发布它。我试图在整个面板上应用效果(例如模糊效果),以​​便当我将面板滑动到另一面板上时,背面的面板会逐渐模糊。(你可以在iPhone或Android App上看到)。 –

相关问题