Domanda

C'è un modo per convertire un immagine bmp a jpg/png senza perdere la qualità in C#?Utilizzando Immagine classe siamo in grado di convertire bmp in jpg, ma la qualità dell'immagine di uscita è molto scarsa.Possiamo ottenere un livello di qualità buono come un immagine convertito in jpg con photoshop con la massima qualità?

È stato utile?

Soluzione

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

Altri suggerimenti

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

Fornito BitmapExtensions da jestro sono ottimi, li ho usati.Tuttavia vorrei mostrare la versione corretta - opere per l'Immagine della classe padre che è più conveniente come penso e fornisce un modo per la fornitura di 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);
    }
}

Fondamentalmente non essere in grado di mantenere la stessa qualità, perché il jpg è (per quanto ne sono a conoscenza) sempre con perdita di qualità, anche con la migliore qualità possibile delle impostazioni.

Se il bit-precisa la qualità è davvero importante, considerare l'utilizzo di png, che ha alcune modalità che sono senza perdita di dati.

Voglio solo dire che il JPEG è per natura un formato lossy.Così in thoery anche alle massime impostazioni che si sta andando ad avere qualche perdita di informazioni, ma dipende molto sull'immagine.Ma il png è lossless.

Si può provare:

Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;

e

Bitmap.CompositingQuality = CompositingQuality.HighQuality;

Che non tenere la qualità abbastanza alta, ma non il più alto possibile.

Sto lavorando su un rapporto di spesa di app, e sono molto soddisfatto con la qualità di default le impostazioni per il formato JPG (e PNG) durante il salvataggio di un oggetto Bitmap.

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

Io sono su .NET 4.6...forse la qualità è migliorata nel successivo quadro versioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top