SkiaSharp XPS DrawBitMap 正在剪辑?

问题描述

我正在使用 SkiaSharp 创建包含用于打印的图像的 XPS(和/或 PDF)文档。 PDF 中的图像被正确拉伸以适合所需的矩形,但在 XPS 上它们似乎被剪裁了。我的代码和示例图片如下。

这是一个错误还是我做错了什么?我原以为 XPS 的 PDF 代码应该是相同的,但也许我需要做一些额外的技巧或技巧?

代码

public void Todocument(string inputPath,bool pdf = false)
        {

            SKDocument document = null;
            var outputPath = Path.Combine(Path.GetDirectoryName(inputPath),Path.GetFileNameWithoutExtension(inputPath)) + (pdf ? ".pdf" : ".xps");

            using var input = File.OpenRead(inputPath);
            using var inputStream = new SKManagedStream(input);
            using var original = SKBitmap.Decode(inputStream);

            // page a little bigger than source image
            var pageRect = new SKRect(0,original.Width + 20,original.Height + 100);

            var renderRect = new SKRect(0,(float)original.Width,(float)original.Height);

            using var outputStream = File.Create(outputPath);
            using var managedStream = new SKManagedWStream(outputStream);

            // null checking removed for readability

            using var canvas = document.BeginPage(pageRect.Width,pageRect.Height);
            canvas.Clear();

            using var p = new SKPaint();

            SKRect picRect;
            float xFactor = 0.25F;
            float yFactor = 0.25F;
            if (pdf)
            {
                // stretch renderRect for pdf
                picRect = new SKRect(renderRect.Left,renderRect.Top,renderRect.Left + renderRect.Width * xFactor,renderRect.Top + renderRect.Height * yFactor);
            }
            else
            {
                // stretch renderRect for xps
                // xFactor = 1.25F;
                // yFactor = 1.25F;
                picRect = new SKRect(renderRect.Left,renderRect.Top + renderRect.Height * yFactor);
            }
            canvas.DrawBitmap(original,original.Info.Rect,picRect,p);

            p.strokeWidth = 2;
            p.Color = SKColors.Red;
            p.Style = SKPaintStyle.stroke;

            // rect same size as original bitmap
            canvas.DrawRect(renderRect,p);

            p.Color = SKColors.Blue;
            // rect same size as stretched bitmap
            canvas.DrawRect(picRect,p);

            using var tp = new SKPaint();
            tp.TextSize = 10.0f;
            tp.IsAntialias = true;
            tp.Isstroke = false;
            //canvas.DrawText($"Page: {pageRect.Height}w {pageRect.Width}h",10F,pageRect.Bottom - 55F,tp);
            tp.Color = SKColors.Red;
            canvas.DrawText($"Source: {original.Width}w {original.Height}h",pageRect.Bottom - 40F,tp);
            tp.Color = SKColors.Blue;
            canvas.DrawText($"Dest: {picRect.Width}w {picRect.Height}h",pageRect.Bottom - 25F,tp);
            canvas.DrawText($"stretched: {xFactor}w {yFactor}h",pageRect.Bottom - 10F,tp);


            // bitmap should fit to the background rect but fails with xps
            //canvas.DrawBitmap(original,renderRect,p);

            document.Close();
        }

XPS 示例:

XPS Sample

PDF 示例:

PDF Sample

原始图片

Original

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)