有没有办法将 bmp 图像转换为 jpg/png 而不会丢失 C# 中的质量?使用 Image 类,我们可以将 bmp 转换为 jpg,但输出图像的质量很差。我们能否获得与使用最高质量的 Photoshop 转换为 jpg 的图像一样好的质量水平?
Ramesh Soni
问问题
93165 次
7 回答
58
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
于 2008-09-03T13:39:51.830 回答
42
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;
}
}
于 2010-03-09T20:37:45.377 回答
16
如果 jestro 的 BitmapExtensions 很棒,我就使用它们。但是想显示更正的版本-适用于 Image 父类,我认为这更方便,并提供了一种提供质量的方法:
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);
}
}
于 2012-01-02T17:34:49.220 回答
1
从根本上说,您将无法保持相同的质量,因为 jpg (据我所知)即使在尽可能高的质量设置下也总是有损。
如果位精确的质量真的很重要,请考虑使用 png,它具有一些无损模式。
于 2008-09-03T13:36:10.700 回答
1
只想说JPEG本质上是一种有损格式。所以理论上,即使在最高设置下,你也会有一些信息丢失,但这在很大程度上取决于图像。但 png 是无损的。
于 2008-09-04T06:52:44.390 回答
1
我正在开发一个费用报告应用程序,当从位图对象保存时,我对 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 上……也许在后续的框架版本中质量有所提高。
于 2015-08-23T11:29:40.150 回答
0
你可以试试:
Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;
和
Bitmap.CompositingQuality = CompositingQuality.HighQuality;
这确实保持了相当高的质量,但不是最高的。
于 2008-09-03T13:33:47.273 回答