本文主要介绍如何使用C#将图片进行压缩并保存到本地。
接收一个原始图片的字节数组、需要保存的图片类型、输出路径和图片质量。方法首先将字节数组转换为一个内存流,然后使用Image.FromStream
方法将内存流转换为一个Image对象。接下来,方法创建一个编码参数对象,设置图片的质量。之后,通过调用GetImageCodecInfo
方法获取指定图片类型对应的编码器信息。最后,调用image.Save
方法将压缩后的图片保存到指定的输出路径。
/// <summary>
/// 压缩图片byte数组并保存到本地
/// </summary>
/// <param name="bytes">原始图片byte数组</param>
/// <param name="format">需要保存图片的MIME类型</param>
/// <param name="outputPath">输出路径</param>
/// <param name="quality">图片质量0-100</param>
private void CompressImage(byte[] bytes, ImageFormat format, string outputPath, long quality)
{using (MemoryStream ms = new MemoryStream(bytes)){Image image = Image.FromStream(ms);// 创建一个编码参数对象EncoderParameters encoderParams = new EncoderParameters(1);encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, quality); // 100表示最高质量(无损)var pngCodec = GetImageCodecInfo(format);// 保存压缩后的图片image.Save(outputPath, pngCodec, encoderParams);}
}
接收一个原始图片的路径、输出路径和图片质量。方法首先使用Image.FromFile
方法加载原始图片。之后,创建一个编码参数对象,设置图片的质量。接下来,通过调用GetImageCodecInfo
方法获取原始图片的类型对应的编码器信息。最后,调用image.Save
方法将压缩后的图片保存到指定的输出路径。
/// <summary>
/// 压缩图片并保存到本地
/// </summary>
/// <param name="inputPath">原始图片路径</param>
/// <param name="outputPath">输出路径</param>
/// <param name="quality">图片质量0-100</param>
private void CompressImage(string inputPath, string outputPath, long quality)
{// 加载原始图片using (Image image = Image.FromFile(inputPath)){// 创建一个编码参数对象EncoderParameters encoderParams = new EncoderParameters(1);encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, quality); // 100表示最高质量(无损)var pngCodec = GetImageCodecInfo(image.RawFormat);// 保存压缩后的图片image.Save(outputPath, pngCodec, encoderParams);}
}
以下用于获取指定图片类型的编码器信息。方法首先调用ImageCodecInfo.GetImageEncoders()
方法获取所有可用的编码器信息。然后,根据指定的图片类型匹配对应的编码器信息。如果指定的格式在已知的格式中不存在,返回默认的MIME
类型。
/// <summary>
/// 设置图片扩展类型
/// </summary>
/// <param name="format">图片</param>
/// <returns></returns>
public ImageCodecInfo GetImageCodecInfo(ImageFormat format)
{ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();// 声明编码器ImageCodecInfo pngCodec;if (format.Equals(ImageFormat.Jpeg))pngCodec = codecs.FirstOrDefault(codec => codec.MimeType == "image/jpeg");else if (format.Equals(ImageFormat.Png))pngCodec = codecs.FirstOrDefault(codec => codec.MimeType == "image/png");else if (format.Equals(ImageFormat.Gif))pngCodec = codecs.FirstOrDefault(codec => codec.MimeType == "image/gif");else if (format.Equals(ImageFormat.Bmp))pngCodec = codecs.FirstOrDefault(codec => codec.MimeType == "image/bmp");else if (format.Equals(ImageFormat.Tiff))pngCodec = codecs.FirstOrDefault(codec => codec.MimeType == "image/tiff");else if (format.Equals(ImageFormat.Icon))pngCodec = codecs.FirstOrDefault(codec => codec.MimeType == "image/x-icon");else// 如果格式未知,返回默认的 MIME 类型pngCodec = codecs.FirstOrDefault(codec => codec.MimeType == "application/octet-stream");return pngCodec;
}