Cmp中的Bmp到jpg / png

时间:2008-09-03 13:29:58

标签: c# image-manipulation

有没有办法在不损失C#质量的情况下将bmp图像转换为jpg / png?使用Image类我们可以将bmp转换为jpg,但输出图像的质量非常差。我们可以使用最高质量的Photoshop来获得与转换为jpg的图像一样好的质量水平吗?

7 个答案:

答案 0 :(得分:54)

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

答案 1 :(得分: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;
    }
}

答案 2 :(得分:10)

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

答案 3 :(得分:1)

从根本上说,你将无法保持相同的质量,因为jpg(据我所知)总是有损,即使质量设置最高。

如果位精确度非常重要,请考虑使用png,它有一些无损模式。

答案 4 :(得分:1)

只想说JPEG本质上是一种有损格式。因此,即使在最高设置下你也会有一些信息丢失,但这很大程度上取决于图像。但是png是无损的。

答案 5 :(得分:0)

您可以尝试:

Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;

Bitmap.CompositingQuality = CompositingQuality.HighQuality;

这确保了相当高的质量,但不是最高的。

答案 6 :(得分:0)

我正在开发费用报告应用程序,从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上......也许后续框架版本的质量有所提高。