关于图像处理:在C#中将Bmp转换为jpg / png

关于图像处理:在C#中将Bmp转换为jpg / png

Bmp to jpg/png in C#

有什么方法可以将bmp图像转换为jpg / png而不损失C#的质量吗?使用Image类,我们可以将bmp转换为jpg,但是输出图像的质量很差。我们能否获得与使用质量最高的Photoshop转换为jpg的图像一样好的质量等级?


1
2
3
4
5
6
7
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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很棒,我使用了它们。但是,我想显示更正的版本-适用于Image父类,这在我看来更为方便,并提供了一种提供质量的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
    }
}

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


从根本上讲,您将无法保持相同的质量,因为jpg(据我所知)即使在可能的最高质量设置下也总是有损的。

如果精确到位的质量真的很重要,请考虑使用png,它具有一些无损的模式。


我正在开发一项费用报告应用程序,从位图对象保存时,我对JPG(和PNG)的默认质量设置感到非常满意。

https://msdn.microsoft.com/zh-cn/library/9t4syfhh(v = vs.110).aspx

1
2
3
Bitmap finalBitmap = ....; //from disk or whatever
finalBitmap.Save(xpsFileName +".final.webp", ImageFormat.Jpeg);
finalBitmap.Save(xpsFileName +".final.webp", ImageFormat.Png);

我在.NET 4.6上...也许在后续框架版本中质量有所提高。


您可以尝试:

1
Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;

1
Bitmap.CompositingQuality = CompositingQuality.HighQuality;

确实可以保证较高的质量,但不能保持最高的质量。


推荐阅读

    linux命令输出加时间?

    linux命令输出加时间?,时间,系统,名称,设备,命令,信息,管理,标准,数字,百度,l

    linux命令日志输出?

    linux命令日志输出?,系统,状态,命令,情况,对比,标准,实时,服务,下来,数据,怎

    linux命令输出到vi?

    linux命令输出到vi?,工作,系统,状态,档案,命令,模式,信息,正规,第一,编辑,lin

    linux命令输出截取?

    linux命令输出截取?,位置,网上,信息,命令,字符串,字符,左边,日志,中间,之间,L

    linux命令输出计算?

    linux命令输出计算?,标准,地址,工作,信息,系统,命令,软件,数据,文件,控制台,l

    linux持续命令输出?

    linux持续命令输出?,系统,工作,地址,信息,情况,状态,数据,管理,工具,指标,lin

    linux命令行打印输出?

    linux命令行打印输出?,地址,工作,命令,网络,信息,标准,系统,文件,目录,控制

    linux命令输出最大值?

    linux命令输出最大值?,地址,网络,系统,时间,数据,高位,较大,位置,不了,最大

    linux命令行动态输出?

    linux命令行动态输出?,标准,工作,信息,系统,命令,地址,文件,数据,管理,设备,l

    linux输出命令窗口?

    linux输出命令窗口?,系统,工具,首页,终端,技术,电脑,命令,窗口,快捷键,桌面,l

    linux输出命令全集?

    linux输出命令全集?,工作,标准,地址,信息,管理,系统,目录,文件,命令,情况,lin

    linux查看输出的命令?

    linux查看输出的命令?,信息,标准,系统,命令,文件,分析,管理,通用,数据,策略,L

    linux查看命令输出?

    linux查看命令输出?,标准,工具,命令,信息,情况,文件,数据,工作,系统,实时,Lin

    linux改显示输出命令?

    linux改显示输出命令?,工作,信息,地址,系统,标准,档案,命令,设备,最新,管理,l

    linux命令输出前后5?

    linux命令输出前后5?,信息,工作,系统,地址,命令,文件,目录,功能,脚本,文本,li

    linux命令输出乱码?

    linux命令输出乱码?,系统,环境,信息,图片,软件,状态,乱码,终端,中文,命令,Lin

    linux输入输出命令?

    linux输入输出命令?,标准,工作,系统,地址,信息,命令,数据,目录,时间,管理,lin

    linux图像查看器命令?

    linux图像查看器命令?,工作,信息,设备,系统,图片,地址,文件,命令,目录,一致,L

    linux格式化输出命令?

    linux格式化输出命令?,系统,时间,信息,设备,工具,电脑,首次,网络,情况,位置,l

    linux命令不输出终端?

    linux命令不输出终端?,信息,系统,工具,暂停,终端,命令,橡胶,管理系统,东莞