BMP в JPG / PNG в C # - PullRequest
       50

BMP в JPG / PNG в C #

52 голосов
/ 03 сентября 2008

Есть ли способ конвертировать изображение bmp в jpg / png без потери качества в C #? Используя класс Image, мы можем конвертировать bmp в jpg, но качество получаемого изображения очень низкое. Можем ли мы получить такой же качественный уровень, как изображение, преобразованное в jpg с помощью Photoshop с самым высоким качеством?

Ответы [ 7 ]

54 голосов
/ 03 сентября 2008
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 голосов
/ 09 марта 2010
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;
    }
}
10 голосов
/ 02 января 2012

Предоставленные BitmapExtensions от Jestro отличные, я их использовал. Однако хотелось бы показать исправленную версию - работает для родительского класса 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 голос
/ 04 сентября 2008

Просто хочу сказать, что JPEG по своей природе является форматом с потерями. Так что даже в самых высоких настройках вы будете иметь некоторую потерю информации, но это во многом зависит от изображения. Но png без потерь.

1 голос
/ 03 сентября 2008

По сути, вы не сможете сохранить то же качество, потому что jpg (насколько я знаю) всегда с потерями даже при максимально возможных настройках качества.

Если качество с битовой точностью действительно важно, рассмотрите возможность использования png, в котором есть несколько режимов без потерь.

0 голосов
/ 23 августа 2015

Я работаю над приложением «Отчет о расходах», и мне очень нравятся стандартные настройки качества для 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 ... возможно, качество улучшилось в последующих выпусках фреймворка.

0 голосов
/ 03 сентября 2008

Вы можете попробовать:

Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;

и

Bitmap.CompositingQuality = CompositingQuality.HighQuality;

Что делает качество довольно высоким, но не максимально возможным.

...