Поделиться через


Практическое руководство. Настройка уровня сжатия JPEG

При сохранении образа на диск может потребоваться изменить параметры образа, чтобы свести к минимуму размер файла или повысить его качество. Вы можете настроить качество изображения JPEG, изменив его уровень сжатия. Чтобы указать уровень сжатия при сохранении изображения JPEG, необходимо создать объект EncoderParameters и передать его в метод Save класса Image. Инициализируйте объект EncoderParameters таким образом, чтобы он был массивом, состоящим из одного EncoderParameter. При создании EncoderParameterукажите кодировщик Quality и требуемый уровень сжатия.

Пример

В следующем примере кода создается объект EncoderParameter и сохраняется три изображения JPEG. Каждое изображение JPEG сохраняется с другим уровнем качества, изменив значение long, переданное конструктору EncoderParameter. Уровень качества 0 соответствует наибольшему сжатию, а уровень качества 100 соответствует наименьшему сжатию.

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

Компиляция кода

Для этого примера требуется:

  • Приложение Windows Forms.

  • PaintEventArgs, который является параметром PaintEventHandler.

  • Файл изображения с именем TestPhoto.jpg и расположенный в c:\.

См. также