在C#中将Bmp转换为jpg / png
时间:2020-03-05 18:47:01 来源:igfitidea点击:
有什么方法可以将bmp图像转换为jpg / png而不丢失C#的质量吗?使用Image类,我们可以将bmp转换为jpg,但是输出图像的质量很差。我们能否获得与使用质量最高的Photoshop转换为jpg的图像一样好的质量水平?
解决方案
回答
看来它具有一些源代码可能会对我们有所帮助...我怀疑我们只是缺少了质量编码器参数<shrug>
回答
你可以试试:
Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;
和
Bitmap.CompositingQuality = CompositingQuality.HighQuality;
确实可以保证较高的质量,但不能保证最高的质量。
回答
从根本上讲,我们将无法保持相同的质量,因为(就我所知)jpg即使在可能的最高质量设置下也总是有损的。
如果精确到位的质量真的很重要,请考虑使用png,它具有某些无损模式。
回答
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
回答
只是想说JPEG本质上是一种有损格式。因此,即使在最高设置下,我们也会丢失一些信息,但这在很大程度上取决于图像。但是png是无损的。
回答
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; } }