EncoderParameter Class

本文介绍如何使用.NET Framework中的System.Drawing.Imaging命名空间和EncoderParameter类调整图像的质量和压缩级别。通过示例代码展示了如何创建EncoderParameter对象,设置不同的质量参数,并保存不同压缩级别的JPEG图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Namespace:System.Drawing.Imaging
Assembly:System.Drawing.dll

用于向图像编码器传递值或值数组。

public sealed class EncoderParameter : IDisposable

继承 ObjectEncoderParameter
实现IDisposable

示例

下面的代码示例演示如何使用 EncoderParameter 构造函数创建 EncoderParameter。 若要运行此示例,请将代码粘贴到 Windows 窗体中,并从窗体的构造函数调用 VaryQualityLevel 方法。此示例需要一个名为 TestPhoto.jpg 的图像文件,该文件位于c:\[

private void VaryQualityLevel()
{
    //获取位图
    Bitmap bmp1 = new Bitmap(@"c:\TestPhoto.jpg");
    ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);

    //基于GUID为质量参数类别创建一个Encoder对象。
    System.Drawing.Imaging.Encoder myEncoder =
        System.Drawing.Imaging.Encoder.Quality;

    //创建一个EncoderParameters对象。
    //EncoderParameters对象具有一个EncoderParameter对象数组。 在这种情况下,数组中只有一个EncoderParameter对象。
    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 ImageCodecInfo GetEncoder(ImageFormat format)
{
    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

    foreach (ImageCodecInfo codec in codecs)
    {
        if (codec.FormatID == format.Guid)
        {
            return codec;
        }
    }
    
    return null;
}

备注

你还可以使用 EncoderParameter 对象来接收特定图像编码器的特定参数支持的可能值的列表。

构造函数

名称说明
EncoderParameter(Encoder, Byte)用指定的 EncoderParameter 对象和一个无符号 8 位整数初始化 Encoder 类的新实例。 将 ValueType 属性设置为 ValueTypeByte,并将 NumberOfValues 属性设置为 1。
EncoderParameter(Encoder, Byte, Boolean)用指定的 EncoderParameter 对象和一个 8 位值初始化 Encoder 类的新实例。 将 ValueType 属性设置为 ValueTypeUndefined 或 ValueTypeByte,将 NumberOfValues 属性设置为 1。
EncoderParameter(Encoder, Byte[])用指定的 EncoderParameter 对象和一个无符号的 8 位整数数组初始化 Encoder 类的新实例。 将 ValueType 属性设置为 ValueTypeByte,将 NumberOfValues 属性设置为数组中的元素数。
EncoderParameter(Encoder, Byte[], Boolean)用指定的 EncoderParameter 对象和一个字节数组初始化 Encoder 类的新实例。 将 ValueType 属性设置为 ValueTypeUndefined 或 ValueTypeByte,将 NumberOfValues 属性设置为数组中的元素数。
EncoderParameter(Encoder, Int16)用指定的 EncoderParameter 对象和一个 16 位整数初始化 Encoder 类的新实例。 将 ValueType 属性设置为 ValueTypeShort,并将 NumberOfValues 属性设置为 1。
EncoderParameter(Encoder, Int16[])用指定的 EncoderParameter 对象和一个 16 位整数数组初始化 Encoder 类的新实例。 将 ValueType 属性设置为 ValueTypeShort,将 NumberOfValues 属性设置为数组中的元素数。
EncoderParameter(Encoder, Int32, EncoderParameterValueType, IntPtr)用指定的 EncoderParameter 对象和三个整数初始化 Encoder 类的新实例,这三个整数分别指定值的数目、值的数据类型和指向存储在 EncoderParameter 对象中的值的指针。
EncoderParameter(Encoder, Int32, Int32)使用指定的 Encoder 对象和 32 位整数对初始化 EncoderParameter 类的新实例。 整数对表示一个分数,第一个整数为分子,第二个整数为分母。 将 ValueType 属性设置为 ValueTypeRational,并将 NumberOfValues 属性设置为 1。
EncoderParameter(Encoder, Int32, Int32, Int32)用指定的 EncoderParameter 对象和三个整数初始化 Encoder 类的新实例,这三个整数分别指定值的数目、值的数据类型和指向存储在 EncoderParameter 对象中的值的指针。
EncoderParameter(Encoder, Int32, Int32, Int32, Int32)用指定的 EncoderParameter 对象和四个 32 位整数初始化 Encoder 类的新实例。 这四个整数表示一个分数范围。 前两个整数表示该范围中最小的分数,而后两个整数表示该范围中最大的分数。 将 ValueType 属性设置为 ValueTypeRationalRange,并将 NumberOfValues 属性设置为 1。
EncoderParameter(Encoder, Int32[], Int32[])用指定的 EncoderParameter 对象和两个 32 位整数数组初始化 Encoder 类的新实例。 这两个数组表示一个分数数组。 将 ValueType 属性设置为 ValueTypeRational,并将 NumberOfValues 属性设置为 numerator 数组中的元素数,它必须与 denominator 数组中的元素数相同。
EncoderParameter(Encoder, Int32[], Int32[], Int32[], Int32[])用指定的 EncoderParameter 对象和四个 32 位整数数组初始化 Encoder 类的新实例。 这四个数组表示一个数组有理范围。 有理范围是指从最小分数值到最大分数值的所有分数的集。 将 ValueType 属性设置为 ValueTypeRationalRange,将 NumberOfValues 属性设置为 numerator1 数组中的元素数,该元素数必须与其他三个数组中的元素数相同。
EncoderParameter(Encoder, Int64)用指定的 EncoderParameter 对象和一个 64 位整数初始化 Encoder 类的新实例。 将 ValueType 属性设置为 ValueTypeLong(32 位),并将 NumberOfValues 属性设置为 1。
EncoderParameter(Encoder, Int64, Int64)使用指定的 Encoder 对象和 64 位整数对初始化 EncoderParameter 类的新实例。 这对整数代表一个整数范围,第一个整数是该范围中最小的数,第二个整数是该范围中最大的数。 将 ValueType 属性设置为 ValueTypeLongRange,并将 NumberOfValues 属性设置为 1。
EncoderParameter(Encoder, Int64[])用指定的 EncoderParameter 对象和一个 64 位整数数组初始化 Encoder 类的新实例。 将 ValueType 属性设置为 ValueTypeLong(32 位),将 NumberOfValues 属性设置为数组中的元素数。
EncoderParameter(Encoder, Int64[], Int64[])用指定的 EncoderParameter 对象和两个 64 位整数数组初始化 Encoder 类的新实例。 这两个数组表示一组整数范围。 将 ValueType 属性设置为 ValueTypeLongRange,并将 NumberOfValues 属性设置为 rangebegin 数组中的元素数,它必须与 rangeend 数组中的元素数相同。
EncoderParameter(Encoder, String)用指定的 EncoderParameter 对象和字符串初始化 Encoder 类的新实例。 该字符串在存储到 EncoderParameter 对象中之前,被转换成一个用 NULL 结束符终止的 ASCII 字符串。 将 ValueType 属性设置为 ValueTypeAscii,并将 NumberOfValues 属性设置为此 ASCII 字符串的长度,该长度包括 NULL 结束符。

属性

名称说明
Encoder获取或设置与此 Encoder 对象关联的 EncoderParameter 对象。 此 Encoder 对象封装全局唯一标识符 (GUID),该标识符指定存储在此 Quality 对象中的参数的类别,例如 ColorDepth、Compression 或 EncoderParameter。
NumberOfValues获取存储在此 EncoderParameter 对象中的值数组的元素数。
Type获取存储在此 EncoderParameter 对象中的值的数据类型。
ValueType获取存储在此 EncoderParameter 对象中的值的数据类型。

方法

名称说明
Dispose()释放由此 EncoderParameter 对象使用的所有资源。
Equals(Object)确定指定的对象是否等于当前对象。 (Inherited from Object)
Finalize()允许 EncoderParameter 对象在垃圾回收操作回收 EncoderParameter 对象之前尝试释放资源并执行其他清理操作。
GetHashCode()作为默认哈希函数。 (Inherited from Object)
GetType()获取当前实例的 Type。 (Inherited from Object)
MemberwiseClone()创建当前 Object 的浅表副本。 (Inherited from Object)
ToString()返回表示当前对象的字符串。 (Inherited from Object)
### 实现 BMP 图像的压缩与保存 对于希望在 C# 中实现 BMP 图像的压缩并将其另存为具有不同质量级别的 JPEG 文件的需求,可以通过使用 .NET Framework 提供的功能轻松完成此操作。下面展示了一个用于将 BMP 转换为指定质量等级的 JPEG 的方法。 #### 定义图像压缩类 定义一个名为 `ImageCompressor` 的静态类,其中包含执行实际工作的公共静态方法: ```csharp using System; using System.Drawing; using System.Drawing.Imaging; public static class ImageCompressor { /// <summary> /// 将给定路径上的位图文件压缩到指定的质量级别,并作为JPEG格式保存至新位置。 /// </summary> public static void CompressAndSaveAsJpeg(string sourceFilePath, string destinationFilePath, long jpegQuality) { EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, jpegQuality); // 获取所有可用编码器列表,并找到JPEG编码器 var codecInfos = ImageCodecInfo.GetImageEncoders(); var jpegEncoder = Array.Find(codecInfos, c => c.FormatID == ImageFormat.Jpeg.Guid); // 设置编码参数集合 var encoderParams = new EncoderParameters(1); encoderParams.Param[0] = qualityParam; using (var originalBmp = new Bitmap(sourceFilePath)) { originalBmp.Save(destinationFilePath, jpegEncoder, encoderParams); } } } ``` 上述代码片段展示了如何创建一个新的 `EncoderParameter` 对象来设置所需的 JPEG 压缩比率[^2]。接着查询系统已安装的所有图像编解码器以查找适合处理 JPEG 数据的那个实例;最后利用该编解码器对象连同之前准备好的参数一起调用原生位图资源的 Save 方法从而达到目的[^4]。 #### 使用示例 要使用上面的方法,只需提供源文件路径、目标文件路径以及期望得到的结果图片质量即可: ```csharp class Program { static void Main() { try { string inputImagePath = @"path\to\bmpfile.bmp"; string outputImagePath = @"desired\output\location.jpg"; // 设定输出JPEG的质量因子(范围通常是0-100) int desiredQualityLevel = 90L; ImageCompressor.CompressAndSaveAsJpeg(inputImagePath, outputImagePath, desiredQualityLevel); Console.WriteLine($"The file has been compressed and saved successfully at {outputImagePath}"); } catch (Exception ex) { Console.Error.WriteLine(ex.Message); } } } ``` 这段程序会尝试读取位于特定目录下的 BMP 文件,对其进行适当程度的压缩之后再存储回磁盘上另一个地方成为新的 JPG 格式的影像资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值