首页 > 解决方案 > 从 Mapsui/SkiaSharp 打印

问题描述

我是使用 Mapsui/SkiaSharp 的新手,如果这很明显,请原谅我。

我正在尝试打印!使用Mapsui使用下面的“渲染”方法(调用Mapsui.Rendering.Skia.MapRenderer)将地图渲染到图像,该方法采用地图、Spherical Mercator 中的世界范围以及图像(或窗口)的大小。这适用于屏幕分辨率。

当我打印时,由于打印机的 DPI 较高,地图上的文本很小且不可读。

这可能是我的经验不足,但我知道 Skia 是在跨平台渲染方面完成的,以实现设备独立性。Mapsui 在文档中也有一个关于缩放的特定部分,但它使用SKCanvasView.IgnorePixelScaling引用,我无法通过仅作用于 SKCanvas 的 MapRenderer 访问它。

关于打印渲染我有什么遗漏吗?

是否有我可以使用的打印特定渲染上下文或管道来自动适当地缩放字体,而不是将位图写入 GDI 图形上下文?

(下面的代码是 PrintDocument 中的 OnPrintPage 覆盖)。

    /// <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;
    }

标签: c#windowsprintingskiasharpmapsui

解决方案


我假设下面的行创建了一个 SKCanvas。

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

您可以使用以下方法调整该画布的比例:

canvas.Scale(myCustomScale, myCustomScale);  

您可能还需要调整视口的宽度、高度和分辨率。

请注意,由于缩放,SKCanvas 宽度和高度可能需要与视口宽度和高度不同。


推荐阅读