Pregunta

Hay alguna forma de convertir una imagen bmp a jpg/png sin perder la calidad en C#?La utilización de la Imagen de la clase se puede convertir bmp a jpg, pero la calidad de imagen de salida es muy baja.Podemos obtener el nivel de calidad tan buena como la de una imagen convertida a jpg con photoshop, con la más alta calidad?

¿Fue útil?

Solución

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

Otros consejos

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

Siempre BitmapExtensions por jestro son grandes, los he usado.Sin embargo le gustaría mostrar la versión corregida - funciona para la Imagen de la clase de padre que es más conveniente, como creo, y proporciona una forma para la calidad del suministro:

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, usted no será capaz de mantener la misma calidad, ya que jpg es (tan lejos como soy consciente de que) siempre con pérdida de datos, incluso con la más alta calidad posible configuración.

Si el bit exacta de la calidad es realmente importante, considerar el uso de png, que tiene algunos de los modos que tienen pérdidas.

Solo quiero decir que JPEG es un formato con pérdida.Así, en thoery incluso en los más altos valores que va a tener algunas pérdidas de información, pero depende mucho de la imagen.Pero png sin pérdida.

Usted puede intentar:

Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;

y

Bitmap.CompositingQuality = CompositingQuality.HighQuality;

Que hace mantener la calidad bastante alta, pero no el más alto posible.

Estoy trabajando en un informe de gastos de la aplicación, y estoy muy contento con el valor predeterminado de la configuración de calidad de JPG (y PNG) cuando el ahorro de un objeto de mapa de bits.

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

Yo estoy en .NET 4.6...tal vez la calidad ha mejorado en posteriores marco versiones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top