首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mapsui/SkiaSharp打印

Mapsui/SkiaSharp打印
EN

Stack Overflow用户
提问于 2019-03-01 18:35:41
回答 1查看 852关注 0票数 0

我刚开始使用Mapsui/SkiaSharp,所以如果这很明显,请原谅我。

我在打印!使用下面的“呈现”方法(调用麻井 )将地图呈现到图像中(调用Mapsui.Rendering.Skia.MapRenderer),该方法获取地图、球面墨卡托中的世界范围以及图像(或窗口)的大小。这对于屏幕分辨率来说很好。

当我打印时,因为打印机的DPI较高,所以地图上的文本很小,不可读。

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

有什么东西是我缺少的渲染打印吗?

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

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

代码语言:javascript
复制
    /// <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文件来打印它,并且有一些皱纹。

代码语言:javascript
复制
    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;
    }
EN

回答 1

Stack Overflow用户

发布于 2019-03-01 20:04:47

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

代码语言:javascript
复制
using (var image = Renderer.Render(Map, Extents, size))

您可以通过以下方式调整画布的比例:

代码语言:javascript
复制
canvas.Scale(myCustomScale, myCustomScale);  

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54950439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档