前言:
用了网上百度的图片压缩以后发现并不合适,
压缩参数 new EncoderParameter(Encoder encoder, long value)
的参数 value
和图片的大小并不是线性相关。
我也没有去深层研究内部构造,根据试参,重新写了算法。
代码:
/// <summary>
/// 压缩图像
/// </summary>
/// <param name="image">需要压缩的图片</param>
/// <param name="copyFileSize">不能大于多少(默认8M)</param>
/// <param name="flag"></param>
/// <returns></returns>
public static Image CompressImage(
this Image image,
int copyFileSize = 8388608,
double flag = 99)
{
var imgMs = new MemoryStream();
image.Save(imgMs, image.RawFormat);
if (imgMs.Length >= copyFileSize)
{
var bmp = new Bitmap(image);
try
{
var imageCode = GetImageCoderInfo("image/jpeg");
var eps = new EncoderParameters(1);
var ep = new EncoderParameter(Encoder.Quality, (long)Math.Ceiling(flag));
eps.Param[0] = ep;
// 该流释放以后会报错
var ms = new MemoryStream();
bmp.Save(ms, imageCode, eps);
bmp.Dispose();
ep.Dispose();
eps.Dispose();
var newImg = Image.FromStream(ms);
imgMs.Dispose();
return CompressImage(newImg, copyFileSize, flag - 1);
}
catch
{
bmp.Dispose();
imgMs.Dispose();
return null;
}
}
imgMs.Dispose();
return image;
}
/// <summary>
/// 获取图片编码类型信息
/// </summary>
/// <param name="codeType"></param>
/// <returns></returns>
private static ImageCodecInfo GetImageCoderInfo(string codeType)
{
var codeInfos = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo codeInfo = null;
foreach (var codeItem in codeInfos)
{
if (codeItem.MimeType.Equals(codeType)) { codeInfo = codeItem; break; }
}
return codeInfo;
}
调用时
Image img = Image.FromFile("F:/1.jpg");
// 压缩到小于8M
Image newImg = img.CompressImage(8388608);
newImg.Save("F:/2.jpg");
newImg.Dispose();
img.Dispose();