1

Я хотел бы использовать элемент FrameworkElement (например, панель) в качестве изображения (для использования SDK Nokia Image). Я хотел бы применить эффект не к изображению, а к элементу 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); 

и ImageCartoon в XAML:

<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? Похоже, вы делаете это в конструкторе.

Проблема может заключаться в том, что ваша линия _cartoonImageBitmap = new WriteableBitmap((int)ImageCartoon.Width, (int)ImageCartoon.Height); выполняется до инициализации ImageCartoon get с его окончательным размером. В конструкторе его размер должен быть равен (0, 0).

Это ошибка, которую вы получили бы от Renderer, если источник-источник будет иметь размер (0, 0), поэтому я думаю, что стоит попытаться создать _cartoonImageBitmap со статическим размером, например (500, 500) ,

Оставьте заявку и сообщите!

+0

Спасибо за вашу помощь, но, к сожалению, это не так. Я проверил, и _cartoonImageBitmap имеет размер. Я могу видеть две проблемы: во-первых: байты [] байтов заполнены 0. когда он должен содержать другие значения. Во-вторых: возможно, мой WriteAsync не закончен, когда я пытаюсь использовать поток. –

+0

Ах, штопать. Ну, так как вы ожидаете WriteAsync, он должен завершиться. Я бы остановился на том, почему массив байтов содержит только нули. Из любопытства, чего вы пытаетесь достичь? –

+0

Да, это была записьAsync. Я только нашел решение, я собираюсь опубликовать его. Я пытаюсь применить эффект на всей панели (например, эффект размытия), так что когда я сдвигаю панель поверх другой, то на задней панели будет постепенно размываться.(вы можете видеть это на iPhone или Android-приложении). –