在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;
    }
}