参考:https://www.cnblogs.com/ZXdeveloper/p/6841878.html
由于参考的博文提供的代码在我的pc上跑起来,会使压缩后的图片有白色边框,所以我做了小小的修改
/// <summary> /// 无损压缩图片 /// </summary> /// <param name="sFile">原图片地址</param> /// <param name="dFile">压缩后保存图片地址</param> /// <param name="flag">压缩质量(数字越小压缩率越高)1-100</param> /// <param name="size">压缩后图片的最大大小</param> /// <param name="sfsc">是否是第一次调用</param> public static bool CompressImage(string sFile, string dFile, int flag = 90, int size = 300, bool sfsc = true) { //如果是第一次调用,原始图像的大小小于要压缩的大小,则直接复制文件,并且返回true FileInfo firstFileInfo = new FileInfo(sFile); if (sfsc == true && firstFileInfo.Length < size * 1024) { firstFileInfo.CopyTo(dFile); return true; } Image iSource = Image.FromFile(sFile); ImageFormat tFormat = iSource.RawFormat; Bitmap ob = new Bitmap(iSource.Width, iSource.Height); Graphics g = Graphics.FromImage(ob); g.Clear(Color.White); g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.DrawImage(iSource, new Rectangle(0, 0, iSource.Width, iSource.Height), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel); g.Dispose(); //设置压缩质量 EncoderParameters ep = new EncoderParameters(); ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, new long[1] { flag }); try { //找到系统中可用的图片编码器信息 ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders(); ImageCodecInfo jpegICIinfo = null; for (int x = 0; x < arrayICI.Length; x++) { if (arrayICI[x].FormatDescription.Equals("JPEG")) { jpegICIinfo = arrayICI[x]; break; } } //如果编码器存在的,可以压缩 if (jpegICIinfo != null) { ob.Save(dFile, jpegICIinfo, ep); FileInfo fi = new FileInfo(dFile); if (fi.Length > 1024 * size) { flag -= 10; CompressImage(sFile, dFile, flag, size, false); } } else { ob.Save(dFile, tFormat); } return true; } catch { return false; } finally { iSource.Dispose(); ob.Dispose(); } }
调试代码:
string spath = @"G:\Backup\pq1.jpg"; string dpath = @"G:\Backup\pq3.jpg"; CompressImage(spath,dpath);
结果:压缩前(1.52 MB)
压缩后(268 KB)