53 votes

Bmp en jpg / png en C #

Est-il possible de convertir une image bmp en jpg / png sans perdre la qualité en C #? En utilisant Image class, nous pouvons convertir bmp en jpg mais la qualité de l'image de sortie est très mauvaise. Pouvons-nous obtenir le même niveau de qualité qu’une image convertie au format jpg en utilisant Photoshop de la plus haute qualité?

56voto

aku Points 54867
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

33voto

jestro Points 929
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;
    }

13voto

net_prog Points 2024

Pourvu que BitmapExtensions de jestro soit génial, je les ai utilisées. Cependant, j'aimerais montrer la version corrigée - fonctionne pour la classe parent Image, ce qui est plus pratique que je le pense et fournit un moyen de fournir de la qualité:

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

3voto

Kevin Fairchild Points 5991

Cela ressemble à du code source qui pourrait vous aider ... Je suppose que vous manquiez juste le paramètre du codeur de qualité < haussement d'épaules >

0voto

GateKiller Points 19113

Tu peux essayer:

 Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;
 

et

 Bitmap.CompositingQuality = CompositingQuality.HighQuality;
 

Ce qui maintient la qualité assez élevée, mais pas la plus haute possible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X