C# 为 Image.Save() 设置 ImageCodec 和编码器参数

C# setting ImageCodec and Encoder Parameters for Image.Save()

我正在编写一个程序,从一些文本文件输入输出大量图像文件。 当前正在使用

创建和保存这些图像
Parallel.ForEach(set, c =>
{
    using (Bitmap b = Generate_Image(c, Watermark))
    {
         //The encoder needs some set up to function properly
         string s = string.Format("{0:0000}", c.Index);
         string filepath = $@"{Directory}\{s}.png";
         //best quality comes from manually configuring the codec and 
         //encoder used for the image saved                                                       
          b.Save(filepath, ImageFormat.Png);
     }
});

但是我注意到 b.Save()ImageCodeInfoEncoderProperties 有过载,这应该能够产生更高质量的图像输出(图像质量是最重要的到程序)。

但是,我无法在任何地方找到创建这些对象然后作为参数传递所需的操作,至少在 Microsoft 文档中也不能使用,奇怪的是,他们的样本没有'编译。因此,如果我可能会问如何使用 Image.Save(Filepath,encoder,settings)?

的方法重载

提前感谢您提供的任何帮助。

我在自己的代码中编写了一个检索该信息的小方法:

    private static ImageCodecInfo GetEncoderInfo(string mimeType)
    {
        foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageEncoders())
            if (codec.MimeType == mimeType)
                return codec;

        return null;
    }

这就是我使用它保存 Jpeg 的方式:

        ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
        if (jpegCodec == null)
            return;

        EncoderParameters encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);

        image.Save(imagePath, jpegCodec, encoderParameters);

它不用于保存 Png:

     image.Save(imagePath, ImageFormat.Png);

您需要以下命名空间:

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

另外,我要提一下,Png 是一种无损图像格式。这就是为什么它没有编码器参数,因为你无法获得比无损更好的质量。

为了在使用 Graphics class 时获得最高质量,请确保设置以下属性:

            graphics.CompositingQuality = CompositingQuality.HighQuality;
            graphics.SmoothingMode = SmoothingMode.HighQuality;
            graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;