来自Mapsui/Skiasharp的印刷



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

我想打印!使用Mapsui使用下面的"渲染"方法(调用mapsui.rendering.skia.maprenderer)将图渲染到图像上,该方法绘制了映射,该地图,球形默塞托中的世界范围以及图像的大小(或窗口)。这适用于屏幕分辨率。

当我打印时,因为打印机的DPI较高,因此on Map文本很小且不可读。

这可能是我的缺乏经验,但我知道Skia是在跨平台渲染设备独立性上完成的。Mapsui在文档中还具有有关缩放的特定部分

我缺少渲染以打印的东西吗?

我可以使用特定的特定渲染上下文或管道,我可以自动适当地缩放字体,而不是将位图写入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 documentrn{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;
    }

我假设下面的行会创建一个skcanvas。

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

您可以使用:

调整该画布的比例
canvas.Scale(myCustomScale, myCustomScale);  

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

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

相关内容

  • 没有找到相关文章

最新更新