1.问题说明
一般情况下,存储图片只需要使用BitMap.Save(string Path,ImageFormat)函数即可,但是默认的jpeg保存质量应该是在60左右.如果默认值不能满足我们的需求,那么就需要根据实际需求修改图片的保存质量.
2.解决方案
ImageCodecInfo类指定需要保存的格式(如jpg等等).
System.Drawing.Imaging.Encoder类用于定制图片需要呈现的方式和各种参数,例如图片质量参数(Quality),扫描方法参数,色度表参数,压缩参数(Compression),颜色深度(ColorDepth)等等,该类型是EncoderParameter(构造函数)的参数之一.
EncoderParameter用于存放所有关于当前图片的修改,一种修改 (即一个不同的Encoder)存放入一个EncoderParameter,最后汇总到EncoderParameters中.就 Encoder.Quality而言,Quality 类别指定图像的压缩级别。 在用于构造 EncoderParameter 时,质量类别的有用值范围为从 0 到 100。 指定的数值越低,压缩越高,因此图像的质量越低。 值为 0 时,图像的质量最差;值为 100 时,图像的质量最佳.
EncoderParameters则是EncoderParameter类的集合数组,是 BitMap.Save(String, ImageCodecInfo, EncoderParameters) 的参数之一.
方法:对System.Drawing.Imaging.Encoder设置,然后通过System.Drawing.Imaging.Encoder构造出来EncoderParameter类,将 EncoderParameter传递给EncoderParameters数组,从而得到一个完全符合自己意愿的图片!
附压缩图片源代码
1 #region 压缩图片 2 3 /// <summary> 4 /// 压缩图片 5 /// </summary> 6 /// <param name="filePath">要压缩的图片的路径</param> 7 /// <param name="filePath_wy">压缩后的图片的路径</param> 8 public void WYang(string filePath, string filePath_wy) 9 { 10 //Bitmap 11 Bitmap bmp = null; 12 13 //ImageCoderInfo 14 ImageCodecInfo ImageCoderType = null; 15 16 //Encoder 17 System.Drawing.Imaging.Encoder ImageEncoder = null; 18 19 //EncoderParameter 20 EncoderParameter ep = null; 21 22 //EncoderParameters 23 EncoderParameters epArray = null; 24 25 try 26 { 27 bmp = new Bitmap(filePath); 28 29 ImageCoderType = this.getImageCoderInfo("image/jpeg"); 30 31 ImageEncoder = System.Drawing.Imaging.Encoder.Quality; 32 33 epArray = new EncoderParameters(1); 34 35 ep = new EncoderParameter(ImageEncoder, 10L); 36 epArray.Param[0] = ep; 37 bmp.Save(filePath_wy, ImageCoderType, epArray); 38 } 39 catch (Exception ex) 40 { 41 throw new Exception(ex.Message); 42 } 43 finally 44 { 45 bmp.Dispose();//释放资源 46 47 ep.Dispose(); 48 49 epArray.Dispose(); 50 } 51 } 52 53 /// <summary> 54 /// 获取图片编码类型信息 55 /// </summary> 56 /// <param name="ImageCoderType">编码类型</param> 57 /// <returns>ImageCodecInfo</returns> 58 private ImageCodecInfo getImageCoderInfo(string ImageCoderType) 59 { 60 ImageCodecInfo[] coderTypeArray = ImageCodecInfo.GetImageEncoders(); 61 62 foreach (ImageCodecInfo coderType in coderTypeArray) 63 { 64 if (coderType.MimeType.Equals(ImageCoderType)) 65 return coderType; 66 } 67 return null; 68 } 69 70 #endregion 压缩图片
♣ getImageCoderInfo方法感觉比较简单,就不做过多的解释了,如果需要,再说呗~
再附图片效果比较
(责任编辑:admin) |