Bitmap finalBitmap = ....; //from disk or whatever
finalBitmap.Save(xpsFileName + ".final.jpg", ImageFormat.Jpeg);
finalBitmap.Save(xpsFileName + ".final.png", ImageFormat.Png);
我在使用.NET 4.6 ......也许后续框架版本的质量有所提高 .
53
var qualityEncoder = Encoder.Quality;
var quality = (long)<desired quality>;
var ratio = new EncoderParameter(qualityEncoder, quality );
var codecParams = new EncoderParameters(1);
codecParams.Param[0] = ratio;
var jpegCodecInfo = <one of the codec infos from ImageCodecInfo.GetImageEncoders() with mime type = "image/jpeg">;
bmp.Save(fileName, jpegCodecInfo, codecParams); // Save to JPG
32
public static class BitmapExtensions
{
public static void SaveJPG100(this Bitmap bmp, string filename)
{
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
bmp.Save(filename, GetEncoder(ImageFormat.Jpeg), encoderParameters);
}
public static void SaveJPG100(this Bitmap bmp, Stream stream)
{
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
bmp.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters);
}
public static ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
}
7 回答
你可以试试:
和
这确实保持了相当高的质量,但不是最高的 .
我正在开发一个费用报告应用程序,从Bitmap对象保存时,我对JPG(和PNG)的默认质量设置非常满意 .
https://msdn.microsoft.com/en-us/library/9t4syfhh%28v=vs.110%29.aspx
我在使用.NET 4.6 ......也许后续框架版本的质量有所提高 .
由jestro提供的BitmapExtensions很棒,我用它们 . 但是想要显示更正的版本 - 适用于Image父类,这比我想象的更方便,并提供了一种提供质量的方法:
从根本上说,你将无法保持相同的质量,因为即使有最高质量设置,jpg(据我所知)总是有损 .
如果位精确质量非常重要,请考虑使用png,它有一些无损模式 .
只是想说JPEG本质上是一种有损格式 . 因此,即使在最高设置下你也会有一些信息丢失,但它在很大程度上取决于图像 . 但是png是无损的 .