Compartir a través de


Cómo: Establecer el nivel de compresión JPEG

Es posible que desee modificar los parámetros de una imagen al guardar la imagen en el disco para minimizar el tamaño del archivo o mejorar su calidad. Puede ajustar la calidad de una imagen JPEG modificando su nivel de compresión. Para especificar el nivel de compresión al guardar una imagen JPEG, debe crear un EncoderParameters objeto y pasarlo al Save método de la Image clase . Inicialice el objeto EncoderParameters para que tenga un array que consista en un EncoderParameter. Cuando crees el EncoderParameter, especifica el codificador Quality y el nivel de compresión deseado.

Ejemplo

El código de ejemplo siguiente crea un EncoderParameter objeto y guarda tres imágenes JPEG. Cada imagen JPEG se guarda con un nivel de calidad diferente modificando el long valor pasado al EncoderParameter constructor. Un nivel de calidad de 0 corresponde a la mayor compresión y un nivel de calidad de 100 corresponde a la menor compresión.

private void VaryQualityLevel()
    {
        // Get a bitmap. The using statement ensures objects
        // are automatically disposed from memory after use.
        using (Bitmap bmp1 = new Bitmap(@"C:\TestPhoto.jpg"))
        {
            ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);

            // Create an Encoder object based on the GUID
            // for the Quality parameter category.
            System.Drawing.Imaging.Encoder myEncoder =
                System.Drawing.Imaging.Encoder.Quality;

            // Create an EncoderParameters object.
            // An EncoderParameters object has an array of EncoderParameter
            // objects. In this case, there is only one
            // EncoderParameter object in the array.
            EncoderParameters myEncoderParameters = new EncoderParameters(1);

            EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);
            myEncoderParameters.Param[0] = myEncoderParameter;
            bmp1.Save(@"c:\TestPhotoQualityFifty.jpg", jpgEncoder, myEncoderParameters);

            myEncoderParameter = new EncoderParameter(myEncoder, 100L);
            myEncoderParameters.Param[0] = myEncoderParameter;
            bmp1.Save(@"C:\TestPhotoQualityHundred.jpg", jpgEncoder, myEncoderParameters);

            // Save the bitmap as a JPG file with zero quality level compression.
            myEncoderParameter = new EncoderParameter(myEncoder, 0L);
            myEncoderParameters.Param[0] = myEncoderParameter;
            bmp1.Save(@"C:\TestPhotoQualityZero.jpg", jpgEncoder, myEncoderParameters);
        }
    }
Private Sub VaryQualityLevel()
    ' Get a bitmap. The Using statement ensures objects
    ' are automatically disposed from memory after use.
    Using bmp1 As New Bitmap("C:\TestPhoto.jpg")
        Dim jpgEncoder As ImageCodecInfo = GetEncoder(ImageFormat.Jpeg)

        ' Create an Encoder object based on the GUID
        ' for the Quality parameter category.
        Dim myEncoder As System.Drawing.Imaging.Encoder = System.Drawing.Imaging.Encoder.Quality

        ' Create an EncoderParameters object.
        ' An EncoderParameters object has an array of EncoderParameter
        ' objects. In this case, there is only one
        ' EncoderParameter object in the array.
        Dim myEncoderParameters As New EncoderParameters(1)

        Dim myEncoderParameter As New EncoderParameter(myEncoder, 50L)
        myEncoderParameters.Param(0) = myEncoderParameter
        bmp1.Save("c:\TestPhotoQualityFifty.jpg", jpgEncoder, myEncoderParameters)

        myEncoderParameter = New EncoderParameter(myEncoder, 100L)
        myEncoderParameters.Param(0) = myEncoderParameter
        bmp1.Save("C:\TestPhotoQualityHundred.jpg", jpgEncoder, myEncoderParameters)

        ' Save the bitmap as a JPG file with zero quality level compression.
        myEncoderParameter = New EncoderParameter(myEncoder, 0L)
        myEncoderParameters.Param(0) = myEncoderParameter
        bmp1.Save("C:\TestPhotoQualityZero.jpg", jpgEncoder, myEncoderParameters)
    End Using
End Sub
private ImageCodecInfo GetEncoder(ImageFormat format)
{
    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
    foreach (ImageCodecInfo codec in codecs)
    {
        if (codec.FormatID == format.Guid)
        {
            return codec;
        }
    }
    return null;
}
Private Function GetEncoder(ByVal format As ImageFormat) As ImageCodecInfo

    Dim codecs As ImageCodecInfo() = ImageCodecInfo.GetImageEncoders()
    Dim codec As ImageCodecInfo
    For Each codec In codecs
        If codec.FormatID = format.Guid Then
            Return codec
        End If
    Next codec
    Return Nothing

End Function

Compilar el código

Este ejemplo requiere:

  • Una aplicación de Windows Forms.

  • Un PaintEventArgs, que es un parámetro de PaintEventHandler.

  • Un archivo de imagen denominado TestPhoto.jpg y ubicado en c:\.

Consulte también