sourceImagePath:传入图片的根路径,例如绝对路径:C:\Program Files (x86)\IIS Express\img\1.jpg
public void compressimage(string sourceImagePath)
{
using (var fileStream = new FileStream(sourceImagePath, FileMode.Open, FileAccess.Read))
{
using (var sourceImage = Image.FromStream(fileStream))
{
// 创建一个新的Bitmap对象,并指定压缩后的尺寸
int compressedWidth = 800; // 压缩后的宽度
int compressedHeight = (int)(sourceImage.Height * ((float)compressedWidth / sourceImage.Width)); // 根据宽度等比例计算高度
using (Bitmap compressedImage = new Bitmap(compressedWidth, compressedHeight))
{
// 将原始图片绘制到新的Bitmap对象中,并进行压缩
using (Graphics graphics = Graphics.FromImage(compressedImage))
{
graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.DrawImage(sourceImage, 0, 0, compressedWidth, compressedHeight);
}
// 获取原始图片的文件名(不包含扩展名)
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(sourceImagePath);
// 获取原始图片的扩展名
string fileExtension = Path.GetExtension(sourceImagePath);
// 构造压缩后的图片路径,使用原始图片的文件名加上".compressed"后缀和原始图片的扩展名
string compressedImages = Path.Combine(currentDirectory, fileNameWithoutExtension + fileExtension);
// 设置压缩质量为50% 可以根据实际情况压缩50L代表压缩50%
EncoderParameter compressionParameter = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 50L);
// 获取JPEG编码器
ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
// 创建编码器参数集合
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = compressionParameter;
// 保存压缩后的图片
compressedImage.Save(compressedImages, jpegCodec, encoderParameters);
}
}
}
}
private static ImageCodecInfo GetEncoderInfo(string mimeType)
{
// 获取所有可用的图像编解码器信息
ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
// 遍历每个图像编解码器信息
foreach (ImageCodecInfo encoder in encoders)
{
// 如果找到与指定 MIME 类型匹配的编解码器信息,返回该信息
if (encoder.MimeType == mimeType)
{
return encoder;
}
}
// 如果未找到匹配的编解码器信息,返回 null
return null;
}