微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SkiaSharp XPS DrawBitMap 正在剪辑?

如何解决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 举报,一经查实,本站将立刻删除。