c# - 从 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;
}
解决方案
我假设下面的行创建了一个 SKCanvas。
using (var image = Renderer.Render(Map, Extents, size))
您可以使用以下方法调整该画布的比例:
canvas.Scale(myCustomScale, myCustomScale);
您可能还需要调整视口的宽度、高度和分辨率。
请注意,由于缩放,SKCanvas 宽度和高度可能需要与视口宽度和高度不同。
推荐阅读
- swift - 哪些版本的 Xcode 支持哪些版本的 Swift?
- c# - 实体框架代码首先选择多个级别进入视图模型
- azure - 更改共享文件夹的计算机名称?
- python - 如何 RGB 混合剪切强度并使用 imshow 显示正确的混合强度?
- c# - Insert into 语句在 sql 查询中有效,在 c# 中出错
- python - 我在 python 中的散点图 X 轴上得到不正确的值
- javascript - 更新单个用户详细信息页面的反应状态
- postgresql - 在 Jelastic 上更改 PostgreSQL 节点上的 shared_buffers 值
- oracle - 如何检查 CLOB 列是否有非 ASCII 字符?
- regex - 使用 linux 工具将行从一种格式转换为另一种格式