Печать из Mapsui/SkiaSharp

Я новичок в использовании 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;
    }

Какую версию Mapsui вы используете?

pauldendulk 01.03.2019 20:59

Я вижу метод Renderer.Render(Map, Extents, size). Это ваш собственный метод или метод Mapsui? потому что я нигде не знаю об этой подписи.

pauldendulk 01.03.2019 21:00

Привет @pauldendulk Я инкапсулирую методы Mapsui, потому что у меня есть уже существующие классы Map и Extents. Я использую MapRenderer.RenderToBitmapStream внутри после создания области просмотра, разрешения и т. д.

Blue Toque 02.03.2019 00:37

И какую платформу вы используете? (WPF, Android, iOS, UWP)

pauldendulk 02.03.2019 08:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
616
1

Ответы 1

Я предполагаю, что строка ниже создает файл SKCanvas.

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

Вы можете настроить масштаб этого холста с помощью:

canvas.Scale(myCustomScale, myCustomScale);  

Вам также может понадобиться настроить ширину, высоту и разрешение области просмотра.

Обратите внимание, что из-за масштабирования ширина и высота SKCanvas могут отличаться от ширины и высоты области просмотра.

Спасибо за ответ. Я использую последнюю бета-версию и, в частности, использую этот метод. Возможно, я неправильно понимаю параметр разрешения, но его изменение, похоже, меняет масштаб. Масштабировать ли разрешение линейно с увеличением DPI?

Blue Toque 02.03.2019 00:39

Я обновил свой вопрос некоторым кодом, в котором я создаю документ XPS с параметром dpi и визуализирую его на этом холсте. Я предполагаю, что могу просто создать холст с масштабом, как вы предлагаете, и вычислить разницу в масштабе между экраном и принтером вручную?

Blue Toque 04.03.2019 19:59

У меня нет опыта работы с документом SkiaSharp XPS. Я не знаю, как canvas.Scale относится к dpi. Это может быть совершенно не связано.

pauldendulk 04.03.2019 20:54

Другие вопросы по теме