『QQ:1353814576』

c# 如何图像质量压缩 减少文件体积大小


c# 图像质量压缩 减少体积

数字图像信息作为最重要的信息之一,被愈来愈广泛的使用。日常开发页经常为了节约服务器磁盘或者传输效率 而需要在不影响人观感的情况下减小图像的体积 ,以下是一个c#图像压缩的方法

public static class CompressionImage  
    {  
        /// <summary>  
        /// 图像压缩 /// </summary>  
        /// <param name="fileStream">图片流</param>  
        /// <param name="quality">压缩质量0-100之間 数值越大质量越高</param>  
        /// <returns></returns>  
        public static byte[] Execute(byte[] ImageBytes, long quality)  
        {  
            try  
            {  
                using (MemoryStream ms = new MemoryStream(ImageBytes))  
                {  
                    ms.Position = 0;  
                    using (System.Drawing.Image img = System.Drawing.Image.FromStream(ms))  
                    {  
                        using (Bitmap bitmap = new Bitmap(img))  
                        {  
                            ImageCodecInfo CodecInfo = GetEncoder(img.RawFormat);  
                            System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;  
                            EncoderParameters myEncoderParameters = new EncoderParameters(1);  
                            EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, quality);  
                            myEncoderParameters.Param[0] = myEncoderParameter;  
                            using (MemoryStream ImageStream = new MemoryStream())  
                            {  
                                bitmap.Save(ImageStream, CodecInfo, myEncoderParameters);  
                                myEncoderParameters.Dispose();  
                                myEncoderParameter.Dispose();  
                                return ImageStream.ToArray();  
                            }  
                        }  
                    }  
                }  
            }  
            catch { }  
            return ImageBytes;//转换出错返回原图像  
        }  
        public static byte[] ToBytes(this Stream fileStream)  
        {  
            byte[] buffer = new byte[fileStream.Length];  
            fileStream.Read(buffer, 0, buffer.Length);  
            return buffer;//转换出错返回原图像  
        }  
        private static ImageCodecInfo GetEncoder(ImageFormat format)  
        {  
            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();  
            foreach (ImageCodecInfo codec in codecs)  
            {  
                if (codec.FormatID == format.Guid)  
                { return codec; }  
            }  
            return null;  
        }  

       //无损压缩
       public bool Execute2(string sFile, string dFile, ref string errMsg,int dHeight=0, int dWidth=0, int flag=60)
       {
           System.Drawing.Image iSource = System.Drawing.Image.FromFile(sFile);
           ImageFormat tFormat = iSource.RawFormat;
           int sW = 0, sH = 0;
           //按比例缩放
           Size tem_size = new Size(iSource.Width, iSource.Height);
           dHeight = dHeight == 0 ? tem_size.Height : dHeight;
           dWidth = dWidth == 0 ? tem_size.Width : dWidth;
           if (tem_size.Width > dHeight || tem_size.Width > dWidth) //将**改成c#中的或者操作符号
           {
               if ((tem_size.Width * dHeight) > (tem_size.Height * dWidth))
               {
                   sW = dWidth;
                   sH = (dWidth * tem_size.Height) / tem_size.Width;
               }
               else
               {
                   sH = dHeight;
                   sW = (tem_size.Width * dHeight) / tem_size.Height;
               }
           }
           else
           {
               sW = tem_size.Width;
               sH = tem_size.Height;
           }
           Bitmap ob = new Bitmap(dWidth, dHeight);
           Graphics g = Graphics.FromImage(ob);
           g.Clear(Color.WhiteSmoke);
           g.CompositingQuality = CompositingQuality.HighQuality;
           g.SmoothingMode = SmoothingMode.HighQuality;
           g.InterpolationMode = InterpolationMode.HighQualityBicubic;
           g.DrawImage(iSource, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);
           g.Dispose();
           //以下代码为保存图片时,设置压缩质量
           EncoderParameters ep = new EncoderParameters();
           long[] qy = new long[1];
           qy[0] = flag;//设置压缩的比例1-100
           EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
           ep.Param[0] = eParam;
           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);
               }
               else
               {
                   ob.Save(dFile, tFormat);
               }
               return true;
           }
           catch(Exception ex)
           {
              //失败异常
               return false;
           }
           finally
           {
               iSource.Dispose();
               ob.Dispose();
           }



       }
      
		
    }

quality 在80以上的 肉眼看着与原图相差不多,但体积可以减少很多