我正在编写一个程序,从一些文本文件输入输出大量图像文件。目前,这些图像正在使用创建和保存
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()
在拍摄ImageCodeInfo
和EncoderProperties
时有过载,这应该能够产生更高质量的图像输出(图像质量对程序至关重要(。
然而,我在任何地方都找不到需要做什么来创建这些对象,然后作为参数传入,至少那些即使在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;