C#无损压缩图片

作者:漫天行 时间:2022-05-26 22:54:39 

话不多说,请看代码:


/// <summary>
   /// 根据指定尺寸得到按比例缩放的尺寸,返回true表示以更改尺寸
   /// </summary>
   /// <param name="picWidth">图片宽度</param>
   /// <param name="picHeight">图片高度</param>
   /// <param name="specifiedWidth">指定宽度</param>
   /// /// <param name="specifiedHeight">指定高度</param>
   /// <returns>返回true表示以更改尺寸</returns>
   private bool GetPicZoomSize(ref int picWidth, ref int picHeight, int specifiedWidth, int specifiedHeight)
   {
     int sW = 0, sH = 0;
     Boolean isZoomSize = false;
     //按比例缩放
     Size tem_size = new Size(picWidth, picHeight);
     if (tem_size.Width > specifiedWidth || tem_size.Height > specifiedHeight) //将**改成c#中的或者操作符号
     {
       if ((tem_size.Width * specifiedHeight) > (tem_size.Height * specifiedWidth))
       {
         sW = specifiedWidth;
         sH = (specifiedWidth * tem_size.Height) / tem_size.Width;
       }
       else
       {
         sH = specifiedHeight;
         sW = (tem_size.Width * specifiedHeight) / tem_size.Height;
       }
       isZoomSize = true;
     }
     else
     {
       sW = tem_size.Width;
       sH = tem_size.Height;
     }
     picHeight = sH;
     picWidth = sW;
     return isZoomSize;
   }
   /// <summary>
   /// 无损压缩图片
   /// </summary>
   /// <param name="sFile">原图片</param>
   /// <param name="dFile">压缩后保存位置</param>
   /// <param name="dHeight">高度</param>
   /// <param name="dWidth">宽度</param>
   /// <param name="flag">压缩质量 1-100</param>
   /// <returns></returns>

public bool GetPicThumbnail(string sFile, string dFile, int dHeight, int dWidth, int flag)
   {
     System.Drawing.Image iSource = System.Drawing.Image.FromFile(sFile);
     ImageFormat tFormat = iSource.RawFormat;
     int sW = iSource.Width, sH = iSource.Height;

GetPicZoomSize(ref sW, ref sH, dWidth, dHeight);

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);//dFile是压缩后的新路径
       }
       else
       {
         ob.Save(dFile, tFormat);
       }
       return true;
     }
     catch
     {
       return false;
     }
     finally
     {
       iSource.Dispose();
       ob.Dispose();
     }
   }

来源:http://www.cnblogs.com/tpfOfBlog/archive/2017/04/12/6700431.html

标签:c#,压缩,图片
0
投稿

猜你喜欢

  • Java 8 动态类型语言Lambda表达式实现原理解析

    2023-08-05 09:04:25
  • Android开发中的简单设置技巧集锦

    2021-10-10 04:40:35
  • spring cloud zuul增加header传输的操作

    2022-12-31 17:24:50
  • MyBatis中resultType和parameterType和resultMap使用总结

    2023-04-01 05:43:42
  • java开发ServiceLoader实现机制及SPI应用

    2022-12-24 09:55:05
  • 使用MAT进行JVM内存分析实例

    2023-12-14 05:29:51
  • java通过ip获取客户端Mac地址的小例子

    2021-12-22 06:37:07
  • Android SDK Manager国内无法更新的解决方案

    2021-06-23 11:02:19
  • OpenTelemetry初识及调用链Trace详解

    2021-08-03 12:37:14
  • Android定时器和倒计时实现淘宝秒杀功能

    2023-01-18 02:17:04
  • opencv实现读取视频保存视频

    2021-08-16 15:57:50
  • C#操作注册表之RegistryKey类

    2022-12-11 06:12:53
  • Android录制按钮源码解析

    2022-06-24 19:24:44
  • Maven中央仓库发布的实现方法

    2023-12-09 07:15:06
  • 详解Mybatis中的PooledDataSource

    2022-10-24 18:08:11
  • android studio节省C盘空间的配置方法

    2023-07-04 16:43:20
  • Java数据结构之数组(动力节点之Java学院整理)

    2023-09-23 21:20:12
  • Android实现发送短信验证码倒计时功能示例

    2023-04-03 09:07:48
  • Android使用手势监听器GestureDetector遇到的不响应问题

    2022-02-27 23:52:40
  • SpringBoot瘦身打包部署的实现

    2021-09-09 16:54:21
  • asp之家 软件编程 m.aspxhome.com