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




