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()
对 ImageCodeInfo
和 EncoderProperties
有过载,这应该能够产生更高质量的图像输出(图像质量是最重要的到程序)。
但是,我无法在任何地方找到创建这些对象然后作为参数传递所需的操作,至少在 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;
我正在编写一个程序,从一些文本文件输入输出大量图像文件。 当前正在使用
创建和保存这些图像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(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;