1

Panel과 같은 FrameworkElement를 이미지 (Nokia Image SDK 사용)로 사용하고 싶습니다. 이미지가 아니라 FrameworkElement에 효과를 적용하고 싶습니다.파일로 저장하지 않고 FrameworkElement를 스트림으로 변환

FrameworkElement를 쓰기 가능 비트 맵으로 사용하고 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 필터 중 하나입니다. XAML에서

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

및 ImageCartoon :

내가 정의 내이 같은 _cartoonImageBitmap 라인

에서 "값이 예상 범위를 벗어"

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

나는 예외를 얻을

 _cartoonImageBitmap = await renderer.RenderAsync(); 

이유에 대해 알고 싶습니까?

FrameworkElement에서 스트림을 가져 오는 더 좋은 방법이 있습니까?

(필자는 writeableBitmap을 읽기 전에 filestorage에 저장할 수 있지만 성능을 높이려면 이미지 저장을 피하고 싶습니다.)

도움을 주셔서 감사합니다.

답변

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은 언제 생성합니까? 당신이 생성자에서 그것을하는 것처럼 보입니다.

ImageCartoon get이 최종 크기로 초기화되기 전에 _cartoonImageBitmap = new WriteableBitmap((int)ImageCartoon.Width, (int)ImageCartoon.Height); 행이 실행되는 것이 문제 일 수 있습니다. 생성자에서 크기는 여전히 (0, 0)이어야합니다.

대상 소스의 크기가 (0, 0) 인 경우 Renderer에서 가져올 오류이므로 정적 크기 (예 : 500, 500)로 _cartoonImageBitmap을 만드는 것이 좋습니다. .

시도해보고 신고 해주세요.

+0

도움을 주셔서 감사합니다.하지만 불행히도 그게 아닙니다. Checked와 _cartoonImageBitmap의 크기가 있습니다. 두 가지 문제가 발생할 수 있습니다. 첫째, byte [] 바이트는 다른 값을 포함해야 할 때 0으로 채 웁니다. 둘째 : 스트림을 사용하려고 할 때 WriteAsync가 끝나지 않았을 수 있습니다. –

+0

아, 젠장. WriteAsync가 완료되기를 기다리고 있기 때문에 좋습니다. 바이트 배열에 0 만 포함 된 이유에 초점을 둡니다. 호기심에서, 당신은 무엇을 성취하려고합니까? –

+0

예, writeAsync였습니다. 방금 해결책을 찾았습니다. 나는 그것을 게시 할 것입니다. 전체 패널 (예 : 흐림 효과)에 효과를 적용하여 다른 패널 위에 패널을 슬라이드 할 때 뒷면의 패널을 점차 흐리게 표시하려고합니다.(당신은 아이폰이나 안드로이드 애플 리케이션에서 볼 수 있습니다). –

관련 문제