C# 压缩图片
第一种:
private string CompressPictures(FileInfo file) { Image image = null; try { string fullpath = String.Empty; //获取未压缩的图片进行压缩 if (file!=null&&file.Length>0) { if(!file.Name.Contains("_compress")) { //压缩图片 image = ImgCompressionHelper.GetPicThumbnail(file.FullName); if (image != null) { //压缩后的图片,图片名称增加_compress string newName = file.Name.Replace(file.Extension, "") + "_compress" + file.Extension; fullpath = file.FullName.Replace(file.Name, newName); image.Save(fullpath); file.Delete(); } } else { fullpath = file.FullName; } } return fullpath; } catch (Exception ex) { Global.Logger.Error(file.FullName); Global.Logger.Error(ex, "MainViewModel.CompressPictures"); return ""; } finally { if (image != null) image.Dispose(); } } /// <summary> /// 图片压缩 /// </summary> /// <param name="sFile">图片路径</param> /// <param name="flag">压缩比1-100</param> /// <returns>返回图片对象</returns> public static Image GetPicThumbnail(string sFile, int flag = 30) { Image result = null; if (sFile != null) { Image inputImage = Image.FromFile(sFile); try { MemoryStream imgms = new MemoryStream(); var arrayICI = ImageCodecInfo.GetImageEncoders(); ImageCodecInfo jpegICIinfo = arrayICI.Where(w => w.FormatDescription.Contains("JPEG")).FirstOrDefault(); if (jpegICIinfo != null) { //以下代码为保存图片时,设置压缩质量 var ep = new EncoderParameters() { Param = new EncoderParameter[] { new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, new long[1]{ flag}) } }; inputImage.Save(imgms, jpegICIinfo, ep); result = Image.FromStream(imgms); } return result; } catch (Exception ex) { throw ex; } finally { inputImage.Dispose(); } } else { return result; } }
第二种:首先项目NuGet搜索nQuant,安装nQuant
private string CompressPictures1(FileInfo file) { try { string fullpath = String.Empty; //获取未压缩的图片进行压缩 if (file != null && file.Length > 0) { if (!file.Name.Contains("_compress")) { string newPath = file.FullName; var quantizer = new WuQuantizer(); //判断图片是否32位深度 using (Bitmap map = new Bitmap(file.FullName)) { if(map.PixelFormat !=System.Drawing.Imaging.PixelFormat.Format32bppArgb) { //图片转换为32位深度 using (Bitmap map1 = ConvertTo32bpp(map)) { string newName = file.Name.Replace(file.Extension, "") + "_32" + file.Extension; newPath = file.FullName.Replace(file.Name, newName); map1.Save(newPath); } } } using (var bitmap = new Bitmap(newPath)) { //压缩图片 using (var quantized = quantizer.QuantizeImage(bitmap)) { string newName = file.Name.Replace(file.Extension, "") + "_compress" + file.Extension; fullpath = file.FullName.Replace(file.Name, newName); quantized.Save(fullpath, ImageFormat.Jpeg); } } File.Delete(file.FullName); File.Delete(newPath); } else { fullpath = file.FullName; } } return fullpath; } catch (Exception ex) { //AsyncLoger.AddErrorLog($"压缩图片:{file.FullName}出错,错误原因:{ex.Message}"); return ""; } } public static Bitmap ConvertTo32bpp(Image img) { var bmp = new Bitmap(img.Width, img.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); using (var gr = Graphics.FromImage(bmp)) gr.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height)); return bmp; }