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上看到)。 –

相關問題