C# 在 Windows 平台压缩图片

下面是一个简单的使用示例:

/// <summary>
/// 对图像流进行压缩,并返回压缩后的图像流。
/// </summary>
/// <param name="originalStream">原始图像的流。</param>
/// <param name="targetQuality">目标压缩质量。(1,100)</param>
/// <returns>压缩后的图像流。</returns>
public static Stream SystemDrawingCompressImage(Stream originalStream, long targetQuality)
{
    // 使用 using 语句确保图像资源在使用后正确释放
    using var originalImage = Image.FromStream(originalStream);

    // 创建一个与原始图像大小相同的位图对象
    var compressedImage = new Bitmap(originalImage.Width, originalImage.Height);

    // 使用 Graphics 对象绘制原始图像到位图对象中
    using (var graphics = Graphics.FromImage(compressedImage))
    {
        graphics.DrawImage(originalImage, 0, 0, originalImage.Width, originalImage.Height);
    }

    // 创建编码器参数,指定压缩质量
    var encoderParameters = new EncoderParameters(1);
    encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, targetQuality);

    // 获取 JPEG 编码器信息
    var jpegEncoderInfo = ImageCodecInfo.GetImageEncoders()
        .FirstOrDefault(encoder => encoder.FormatID == ImageFormat.Jpeg.Guid);

    // 创建一个内存流用于保存压缩后的图像
    var compressedStream = new MemoryStream();

    // 如果 JPEG 编码器信息不为空,将压缩后的图像保存到内存流中
    if (jpegEncoderInfo != null)
    {
        compressedImage.Save(compressedStream, jpegEncoderInfo, encoderParameters);
    }

    // 将内存流的位置重置为起始位置,以便读取压缩后的图像
    compressedStream.Position = 0;

    // 返回压缩后的图像流
    return compressedStream;
}