You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#中使用SixLabors.ImageSharp保存图片遇Save方法解析错误的解决办法

问题解决:PDF转PNG时Save方法重载冲突

问题根源很明确:document.Render()返回的是System.Drawing.Image对象,不是你引入的SixLabors.ImageSharp库中的Image类型。所以你调用Save时,实际触发的是System.Drawing自带的Save方法,和ImageSharp的扩展方法参数不匹配,才会抛出重载冲突的错误。

给你两种可行的解决方式:

方式一:直接用System.Drawing原生方法保存PNG

不需要依赖ImageSharp的编码器,直接调用System.Drawing.Image的Save方法指定PNG格式即可,代码修改如下:

using System;
using System.Drawing.Imaging;
using PdfiumViewer;

class Program
{
    static void Main(string[] args)
    {
        string pdfPath = @"/Users/i42571/Downloads/testconvert2.pdf";  
        string outputImagePath = @"/Users/i42571/Downloads/output.png";  

        using (var document = PdfDocument.Load(pdfPath))
        {
            using (var image = document.Render(0, 200, 200, true)) 
            {
                // 直接用System.Drawing的ImageFormat.Png保存
                image.Save(outputImagePath, ImageFormat.Png);  
                Console.WriteLine($"Image saved at {outputImagePath}");
            }
        }
    }
}

方式二:转换为ImageSharp的Image后使用PngEncoder

如果需要用ImageSharp的PngEncoder做自定义配置(比如压缩级别、透明度设置),需要先把System.Drawing.Image转换为ImageSharp的Image对象,代码如下:

using System;
using System.IO;
using PdfiumViewer;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Png;

class Program
{
    static void Main(string[] args)
    {
        string pdfPath = @"/Users/i42571/Downloads/testconvert2.pdf";  
        string outputImagePath = @"/Users/i42571/Downloads/output.png";  

        using (var document = PdfDocument.Load(pdfPath))
        {
            using (var sysImage = document.Render(0, 200, 200, true)) 
            {
                // 将System.Drawing.Image写入内存流
                using (var ms = new MemoryStream())
                {
                    sysImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                    ms.Position = 0;
                    
                    // 用ImageSharp加载流,得到ImageSharp的Image对象
                    using (var image = Image.Load(ms))
                    {
                        // 调用ImageSharp的Save方法,使用PngEncoder
                        image.Save(outputImagePath, new PngEncoder()
                        {
                            // 这里可以添加自定义配置,比如:
                            // CompressionLevel = PngCompressionLevel.BestCompression
                        });
                        Console.WriteLine($"Image saved at {outputImagePath}");
                    }
                }
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Heisenberg

火山引擎 最新活动