首页 文章

Cmp中的Bmp到jpg / png

提问于
浏览
52

有没有办法将bmp图像转换为jpg / png而不会失去C#的质量?使用Image类我们可以将bmp转换为jpg,但输出图像的质量非常差 . 我们可以使用最高质量的photoshop获得与转换为jpg的图像一样好的质量水平吗?

7 回答

  • 0

    你可以试试:

    Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;
    

    Bitmap.CompositingQuality = CompositingQuality.HighQuality;
    

    这确实保持了相当高的质量,但不是最高的 .

  • 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 ......也许后续框架版本的质量有所提高 .

  • 53
    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
    
  • 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;
        }
    }
    
  • 1

    由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);
        }
    }
    
  • 1

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

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

  • 10

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

相关问题