Как выполнить рендеринг InkCanvas в изображение в приложении UWP Windows 10?


person mudbox    schedule 22.08.2015    source источник
comment
[inkCanvas] .InkPresenter.StrokeContainer.SaveAsync можно сохранить как .gif   -  person tao    schedule 22.08.2015
comment
Да, я в курсе. Однако я предполагаю, что это ISF (Ink Stroke Format), встроенный в .gif. Сама гифка очень уродливая в открытии, я не могу ее использовать. Я определенно хочу использовать RenderTargetBitmap, но он работает не так, как ожидалось. Я также попытался декодировать gif с помощью BitmapDecoder, получить данные пикселей и закодировать их с помощью BitmapEncoder в другой формат, тоже безуспешно (он содержит только нули, все изображение черное). Что я действительно хочу, так это визуализировать изображение в формате PNG или JPG, например, с белым фоном. Может быть, потом им манипулируем. Кто-нибудь может помочь?   -  person mudbox    schedule 22.08.2015
comment
Я попытался вернуться к старой комбинации InkManager + Canvas, но InkManager выдает исключение COM при создании экземпляра.   -  person mudbox    schedule 22.08.2015
comment
Хорошо, у меня будет решение, включающее Win2D (оболочка Direct2D .NET от Microsoft). Win2D можно использовать в приложении UWP через пакет nuget. Очень хороший материал. С его помощью мне удалось сохранить чернильные штрихи в изображение (jpeg, png и другие форматы).   -  person mudbox    schedule 24.08.2015
comment
@mudbox, я предлагаю вам написать то, что вы нашли, в ответ, чтобы он мог помочь другим.   -  person Justin XL    schedule 11.09.2015


Ответы (2)


Вот как я решил эту проблему с Win2D. Прежде всего, добавьте в проект Win2D.uwp пакет nuget. Затем используйте этот код:

CanvasDevice device = CanvasDevice.GetSharedDevice();
CanvasRenderTarget renderTarget = new CanvasRenderTarget(device, (int)inkCanvas.ActualWidth, (int)inkCanvas.ActualHeight, 96);

using (var ds = renderTarget.CreateDrawingSession())
{
    ds.Clear(Colors.White);
    ds.DrawInk(inkCanvas.InkPresenter.StrokeContainer.GetStrokes());
}

using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
    await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Jpeg, 1f);
person mudbox    schedule 13.09.2015
comment
можешь объяснить код плз? не ясно. Я хочу рисовать на изображении, взятом из файла .. - person Amine Da.; 10.10.2015
comment
Все, что вам нужно знать, здесь. Пожалуйста, просмотрите содержание. microsoft.github.io/Win2D/html/Introduction.htm Если хотите чтобы нарисовать изображение: 1. Убедитесь, что вы добавили в проект пакет слепков Win2D.uwp (насколько мне известно, он работает только с UWP) 2. Вам понадобится CanvasControl в XAML <canvas:CanvasControl x:Name="canvas" ClearColor="White" CreateResources="CanvasControl_CreateResources" Draw="CanvasControl_Draw"/> - person mudbox; 11.10.2015
comment
3. Поскольку загрузка растрового изображения выполняется асинхронно, вам понадобится этот трюк - person mudbox; 11.10.2015
comment
Спасибо ! Чтобы прояснить, я хотел нарисовать штрихи на изображении и сохранить их вместе со штрихами в том же файле. - person Amine Da.; 12.10.2015
comment
Затем вам понадобится элемент управления, содержащий изображение в XAML (например: Image, Canvas и т. Д.). Вам также понадобится элемент управления InkCanvas (UWP) поверх элемента управления изображением. Если вам не нужно отображать окончательное визуализированное изображение в пользовательском интерфейсе, вы можете рисовать со смещением. Вам просто нужно получить источник изображения из элемента управления, который вы хотите нарисовать в качестве фона (я не знаю эту часть, возможно, вам нужно преобразовать в растровое изображение), затем загрузить и вызвать DrawImage в сеансе рисования. В этом же сеансе вы рисуете чернильные штрихи с помощью DrawInk. - person mudbox; 13.10.2015
comment
Чтобы завершить ответ @mudbox, вы можете загрузить растровое изображение, подобное этому CanvasBitmap backgroundBitmap = await CanvasBitmap.LoadAsync(device, filePath);, и передать его в ds: ds.DrawImage(backgroundBitmap); - person crazyphoton; 01.12.2015

Попробуйте InkPresenter.StrokeContainer свойство http://blogs.windows.com/buildingapps/2015/09/08/going-beyond-keyboard-mouse-and-touch-with-natural-input-10-by-10/

person Daiki Minamoto    schedule 11.09.2015
comment
Добро пожаловать в Stack Overflow! Хотя теоретически это может дать ответ на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки. . - person hg8; 11.09.2015