Pergunta

Existe alguma maneira de converter uma imagem bmp para jpg/png sem perder a qualidade em C#?Usando a classe Image podemos converter bmp em jpg, mas a qualidade da imagem de saída é muito ruim.Podemos obter um nível de qualidade tão bom quanto uma imagem convertida para jpg usando o photoshop com a mais alta qualidade?

Foi útil?

Solução

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

Outras dicas

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

Desde que BitmapExtensions do jestro sejam ótimos, eu os usei.No entanto, gostaria de mostrar a versão corrigida - funciona para a classe pai Image, que é mais conveniente, como penso, e fornece uma maneira de fornecer qualidade:

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

Fundamentalmente, você não conseguirá manter a mesma qualidade porque o jpg (até onde eu sei) sempre apresenta perdas, mesmo com as configurações de qualidade mais altas possíveis.

Se a qualidade com precisão de bits for realmente importante, considere usar png, que possui alguns modos sem perdas.

Só quero dizer que JPEG é por natureza um formato com perdas.Então, mesmo nas configurações mais altas, você terá alguma perda de informações, mas depende muito da imagem. Mas o png não tem perdas.

Podes tentar:

Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;

e

Bitmap.CompositingQuality = CompositingQuality.HighQuality;

O que mantém a qualidade bastante alta, mas não a mais alta possível.

Estou trabalhando em um aplicativo de relatório de despesas e estou muito satisfeito com as configurações de qualidade padrão para JPG (e PNG) ao salvar a partir de um objeto 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);

Estou no .NET 4.6...talvez a qualidade tenha melhorado nas versões subsequentes do framework.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top