Визуализировать изображение из коллекции StrokeCollection в С#

Мне нужно получить изображение из StrokeCollection, но у меня нет доступа к самому визуальному элементу (InkCanvas) из-за структуры mvvm. Возможно, есть простой способ сделать это?

XAML:

<InkCanvas x:Name="paintSurface" Grid.Row="0" Opacity="0.2" Strokes="{Binding Strokes}">
    <InkCanvas.DefaultDrawingAttributes>
        <DrawingAttributes Color="Black" Width="10" Height="10"/>
    </InkCanvas.DefaultDrawingAttributes>
</InkCanvas>

Модель просмотра:

private StrokeCollection _strokes;
public StrokeCollection Strokes {
    get => _strokes;
    set => SetProperty(ref _strokes, value);
} 

Теперь я просто хочу преобразовать StrokeCollection в некоторую форму обрабатываемого изображения, будь то растровое изображение, растровое изображение, мат, изображение EmguCV, не важно. Спасибо заранее :)


person KilianS    schedule 16.10.2020    source источник
comment
Вы смотрели этот пост? stackoverflow.com/questions/49231819 /   -  person trix    schedule 16.10.2020
comment
Вы можете визуализировать targetbitmap в представлении. Вам просто нужно вызвать это из модели представления или сообщить модели представления, что это сделано. Вы, вероятно, не захотите выполнять автоматизированные тесты для части пользовательского интерфейса, но вы можете инкапсулировать код в поведении, если хотите использовать его повторно. Вам нужны фотографии? Вы можете извлечь точки из штрихов и построить геометрию, используя данные для путей.   -  person Andy    schedule 16.10.2020


Ответы (2)


Вот ваш ответ. Сохранить StrokeCollection как изображение во всех форматах.
https://stackoverflow.com/a/51207941/7300644

person Sandeep Jadhav    schedule 23.10.2020

Я решил свою проблему, передав StrokeCollection вспомогательному классу, где я просто создаю новый InkCanvas, добавляю штрихи (из исходного InkCanvas в пользовательском интерфейсе) и визуализирую его.

public static Bitmap convertStrokestoImage(StrokeCollection strokes, int width, int height)
    {
        InkCanvas InkyStinky = new InkCanvas();
        InkyStinky.RenderSize = new System.Windows.Size(width, height);
        InkyStinky.Strokes.Add(strokes);
        RenderTargetBitmap bmp = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
        bmp.Render(InkyStinky);
        MemoryStream stream = new MemoryStream();
        BitmapEncoder encoder = new BmpBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(bmp));
        encoder.Save(stream);
        Bitmap b = new Bitmap(stream);
        return b;
    }
person KilianS    schedule 04.12.2020