Сохранить Windows Ink как прозрачное изображение PNG — отсутствующие штрихи маркера

Я пытаюсь включить Windows Ink в приложение UWP и начал с адаптации учебное приложение Windows Ink для сохранения нарисованных штрихов в виде изображения PNG (вместо GIF/ISF).

Итак, представление XAML включает в себя Windows.UI.Xaml.Controls.InkToolbar и Windows.UI.Xaml.Controls.InkCanvas, и я могу рисовать штрихи на холсте и сохранять их как файл изображения с помощью следующего кода:

IReadOnlyList<InkStroke> currentStrokes = inkCanvas.InkPresenter.StrokeContainer.GetStrokes();
if (currentStrokes.Count > 0)
{
    StorageFile file;
    // Using a file picker to identify the target file -> omitted this part
    if (file != null)
    {
        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(currentStrokes);
        }
        using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
            await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Png, 1f);
    }
}

Пока все работает нормально. Теперь я хотел бы сохранить изображение с прозрачным фоном и изменить следующую строку:

ds.Clear(Colors.Transparent);

Даже в этом случае файл сохраняется, фон прозрачен, а штрихи шариковой ручки и карандаша отображаются правильно, но результат изображения не включает штрихи, нарисованные с помощью инструмента Выделение.

Может кто-нибудь объяснить, почему эти штрихи опущены в этом случае? Можно ли как-то отрисовать штрихи Highlighter на прозрачном фоне?


person andreask    schedule 14.09.2017    source источник


Ответы (1)


Проблема в том, что штрихи выделения прозрачны. Когда вы очищаете цвет Transparent. Выделенные штрихи будут обнаружены нелегко. По вашему требованию вы можете установить новый attributes без attributes.DrawAsHighlighter для InkPresenter.

private void SetHighLight()
{
  InkDrawingAttributes drawingAttributes = 
inkCanvas.InkPresenter.CopyDefaultDrawingAttributes();
  InkDrawingAttributes attributes = new InkDrawingAttributes();
  attributes.PenTip = PenTipShape.Rectangle;
  attributes.Size = new Size(4, 10);
  attributes.Color = drawingAttributes.Color;
  inkCanvas.InkPresenter.UpdateDefaultDrawingAttributes(attributes);
}

Добавьте новый слой перед вызовом DrawInk и задайте ему непрозрачность. И сделал inkCanvas с непрозрачностью 0,5 специально для маркера, выглядя так, как будто вы используете маркер.

private void GetCanvasRender(out CanvasRenderTarget renderTarget, float opacity)
{
    CanvasDevice device = CanvasDevice.GetSharedDevice();
    renderTarget = new CanvasRenderTarget(device, (int)ink.ActualWidth, (int)ink.ActualHeight, 96);
    using (var ds = renderTarget.CreateDrawingSession())
    {
        ds.Clear(Colors.Transparent);
        using (ds.CreateLayer(opacity))
        {
            ds.DrawInk(ink.InkPresenter.StrokeContainer.GetStrokes());
        }
    }
}
person Nico Zhu - MSFT    schedule 15.09.2017