Bmp到jpg / png在C#
有什么办法将BMP图像转换成jpg / png而不会损失C#的质量吗? 使用Image类我们可以将bmp转换为jpg,但输出图像的质量很差。 我们可以获得质量水平像一个图像转换为JPG使用最高质量的Photoshop?
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
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; } }
提供由jestro BitmapExtensions是伟大的,我用它们。 然而,想要显示更正版本 – 适用于图像父级,这是我认为更方便,并提供一种方法来提供质量:
public static class ImageExtensions { public static void SaveJpeg(this Image img, string filePath, long quality) { var encoderParameters = new EncoderParameters(1); encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); img.Save(filePath, GetEncoder(ImageFormat.Jpeg), encoderParameters); } public static void SaveJpeg(this Image img, Stream stream, long quality) { var encoderParameters = new EncoderParameters(1); encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); img.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters); } static ImageCodecInfo GetEncoder(ImageFormat format) { ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); return codecs.Single(codec => codec.FormatID == format.Guid); } }
这看起来像它有一些源代码,可能会帮助你…我怀疑你只是错过了质量编码器参数< 耸肩 >
基本上,你将无法保持相同的质量,因为即使在最高质量的情况下,jpg是(据我所知)总是有损耗的。
如果比特精确的质量真的很重要,可以考虑使用png,它有一些无损的模式。
只是想说JPEG本质上是一种有损格式。 所以即使在最高的设置下,你也会有一些信息丢失,但是这取决于图像。但是png是无损的。
你可以试试:
Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;
和
Bitmap.CompositingQuality = CompositingQuality.HighQuality;
哪个确保质量相当高,但不是最高的。
我正在开发一个开支报告应用程序,而且我非常喜欢从Bitmap对象保存的JPG(和PNG)的默认质量设置。
https://msdn.microsoft.com/en-us/library/9t4syfhh%28v=vs.110%29.aspx
Bitmap finalBitmap = ....; //from disk or whatever finalBitmap.Save(xpsFileName + ".final.jpg", ImageFormat.Jpeg); finalBitmap.Save(xpsFileName + ".final.png", ImageFormat.Png);
我在.NET 4.6 …也许在随后的框架版本中质量得到了改善。