Печать от Mapsui / SkiaSharp - PullRequest
       30

Печать от Mapsui / SkiaSharp

0 голосов
/ 01 марта 2019

Я новичок в использовании Mapsui / SkiaSharp, так что простите меня, если это очевидно.

Я пытаюсь напечатать!Карта визуализируется в изображение с помощью Mapsui с использованием метода «Render», приведенного ниже (вызывает Mapsui.Rendering.Skia.MapRenderer ), которое берет карту, мир расширяется в Spherical Mercator,и размер изображения (или окна).Это прекрасно работает для разрешений экрана.

Когда я печатаю, поскольку DPI для принтера выше, текст на карте крошечный и нечитаемый.

Это может быть моей неопытностью, но я знаю, что Skia выполнена в кроссплатформенном рендеринге для независимости от устройства.Mapsui также имеет специальный раздел в документации о масштабировании, но он ссылается на SKCanvasView.IgnorePixelScaling , к которому у меня нет доступа через MapRenderer, который действует только на SKCanvas.

Есть ли что-то, чего мне не хватает в рендеринге для печати?

Есть ли какой-то специфический для печати контекст или конвейер рендеринга, который я могу использовать для автоматического масштабирования шрифтов, а не для записи растрового изображения в контекст GDI Graphics?

(ниже приведен код переопределения OnPrintPage из PrintDocument).

    /// <summary>
    /// Do the printing
    /// </summary>
    /// <param name="e"></param>
    protected override void OnPrintPage(PrintPageEventArgs e)
    { 
        try
        {
            // divide by 100 because e.PageBounds is inches times 100
            Size size = new Size(
                e.PageBounds.Width * (int)(e.Graphics.DpiX / 100.0f),
                e.PageBounds.Height * (int)(e.Graphics.DpiY / 100.0f));

            // draw the bitmap to the graphics context
            using (var image = Renderer.Render(Map, Extents, size))
                e.Graphics.DrawImage(image, 0, 0, e.PageBounds.Width, e.PageBounds.Height);

        }
        catch (Exception ex)
        {
            Trace.TraceError("MapReportPrintDocument.OnPrintPage: Error printing document\r\n{0}", ex);
        }
    }

Отредактировано для добавления дополнительных сведений;Один из методов запроса, который дал мне некоторые результаты, заключается в следующем: рендеринг в XpsDocument создает контекст, в котором я могу дать контексту документа знать DPI, и он автоматически настраивает масштабирование шрифтов для меня.Это не идеально, так как теперь мне нужно манипулировать файлом XPS, чтобы распечатать его, и с этим есть некоторые складки.

    public string RenderToXps(IMap map, Extents extents, SizeF size, float dpi = 72)
    {
        var resolution = Mapsui.Utilities.ZoomHelper.DetermineResolution(extents.Width, extents.Height, size.Width, size.Height);
        var viewport = new Mapsui.Viewport()
        {
            Center = extents.Center.ToMapsui(),
            Resolution = resolution,
            Width = size.Width,
            Height = size.Height
        };

        var msMap = map.GetMapsuiMap();

        var path = Path.GetTempFileName();
        using (var stream = new SkiaSharp.SKFileWStream(path))
        {
            using (var document = SkiaSharp.SKDocument.CreateXps(stream, dpi))
            {

                var canvas = document.BeginPage(size.Width, size.Height);
                Renderer.Render(canvas, viewport, msMap.Layers, msMap.Widgets);
                document.EndPage();
            }
        }

        return path;
    }

1 Ответ

0 голосов
/ 01 марта 2019

Я предполагаю, что строка ниже создает SKCanvas.

using (var image = Renderer.Render(Map, Extents, size))

Вы можете настроить масштаб этого холста с помощью:

canvas.Scale(myCustomScale, myCustomScale);  

Вам также может понадобиться настроить ширину, высоту и разрешение области просмотра.

Обратите внимание, что из-за масштабирования ширина и высота SKCanvas могут отличаться от ширины и высоты области просмотра.

...