Я новичок в использовании Mapsui/SkiaSharp, так что простите меня, если это очевидно.
Я пытаюсь печатать! Карта визуализируется в изображение с использованием Мапсуи с использованием описанного ниже метода «Визуализация» (вызывает 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;
}
Я вижу метод Renderer.Render(Map, Extents, size). Это ваш собственный метод или метод Mapsui? потому что я нигде не знаю об этой подписи.
Привет @pauldendulk Я инкапсулирую методы Mapsui, потому что у меня есть уже существующие классы Map и Extents. Я использую MapRenderer.RenderToBitmapStream внутри после создания области просмотра, разрешения и т. д.
И какую платформу вы используете? (WPF, Android, iOS, UWP)





Я предполагаю, что строка ниже создает файл SKCanvas.
using (var image = Renderer.Render(Map, Extents, size))
Вы можете настроить масштаб этого холста с помощью:
canvas.Scale(myCustomScale, myCustomScale);
Вам также может понадобиться настроить ширину, высоту и разрешение области просмотра.
Обратите внимание, что из-за масштабирования ширина и высота SKCanvas могут отличаться от ширины и высоты области просмотра.
Спасибо за ответ. Я использую последнюю бета-версию и, в частности, использую этот метод. Возможно, я неправильно понимаю параметр разрешения, но его изменение, похоже, меняет масштаб. Масштабировать ли разрешение линейно с увеличением DPI?
Я обновил свой вопрос некоторым кодом, в котором я создаю документ XPS с параметром dpi и визуализирую его на этом холсте. Я предполагаю, что могу просто создать холст с масштабом, как вы предлагаете, и вычислить разницу в масштабе между экраном и принтером вручную?
У меня нет опыта работы с документом SkiaSharp XPS. Я не знаю, как canvas.Scale относится к dpi. Это может быть совершенно не связано.
Какую версию Mapsui вы используете?