C#为Image.Save()设置ImageCodec和Encoder参数



我正在编写一个程序,从一些文本文件输入输出大量图像文件。目前,这些图像正在使用创建和保存

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(文件路径,编码器,设置(的方法重载?

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

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

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类时获得最高质量,请确保设置以下属性:

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

相关内容

  • 没有找到相关文章

最新更新