架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 34607|回复: 3

[资料] c#大图片压缩算法,减少图片体积

[复制链接]
发表于 2016-8-24 14:39:44 | 显示全部楼层 |阅读模式
QQ截图20160824143325.jpg


声明:

图片压缩算法,不建议对小图片进行压缩,一般文件小于1m的,真心没必要压缩,

图片很小的,例如:几百KB的图片,有可能不会减少图片体积,反而压缩后更大,也很正常,

请大家合理使用,并不是,所有图片,越压缩越好!!!!!

上面是我对2M多的图片进行了测试,压缩质量设置了50,压缩到了800KB,放大和缩小和原图,几乎没有什么区别。


代码如下:

  1. private void button3_Click(object sender, EventArgs e)
  2.         {
  3.             using (OpenFileDialog ofd = new OpenFileDialog())
  4.             {
  5.                 ofd.Filter = "图片|*.jpg;*.png;*.gif;*.jpeg;*.bmp";
  6.                 if (ofd.ShowDialog() == DialogResult.OK)
  7.                 {
  8.                     using (FileStream file = new FileStream(ofd.FileName, FileMode.Open))
  9.                     {
  10.                         var img = CompressionImage(file, 50L);
  11.                         MessageBox.Show(CreateImageFromBytes(AppDomain.CurrentDomain.BaseDirectory + @"" + Guid.NewGuid().ToString(), img));
  12.                     }

  13.                 }
  14.             }
  15.         }

  16.         /// <summary>
  17.         /// Convert Byte[] to Image
  18.         /// </summary>
  19.         /// <param name="buffer"></param>
  20.         /// <returns></returns>
  21.         public static Image BytesToImage(byte[] buffer)
  22.         {
  23.             MemoryStream ms = new MemoryStream(buffer);
  24.             Image image = System.Drawing.Image.FromStream(ms);
  25.             return image;
  26.         }

  27.         /// <summary>
  28.         /// Convert Byte[] to a picture and Store it in file
  29.         /// </summary>
  30.         /// <param name="fileName"></param>
  31.         /// <param name="buffer"></param>
  32.         /// <returns></returns>
  33.         public static string CreateImageFromBytes(string fileName, byte[] buffer)
  34.         {
  35.             string file = fileName;
  36.             Image image = BytesToImage(buffer);
  37.             ImageFormat format = image.RawFormat;
  38.             if (format.Equals(ImageFormat.Jpeg))
  39.             {
  40.                 file += ".jpeg";
  41.             }
  42.             else if (format.Equals(ImageFormat.Png))
  43.             {
  44.                 file += ".png";
  45.             }
  46.             else if (format.Equals(ImageFormat.Bmp))
  47.             {
  48.                 file += ".bmp";
  49.             }
  50.             else if (format.Equals(ImageFormat.Gif))
  51.             {
  52.                 file += ".gif";
  53.             }
  54.             else if (format.Equals(ImageFormat.Icon))
  55.             {
  56.                 file += ".icon";
  57.             }
  58.             System.IO.FileInfo info = new System.IO.FileInfo(file);
  59.             System.IO.Directory.CreateDirectory(info.Directory.FullName);
  60.             File.WriteAllBytes(file, buffer);
  61.             return file;
  62.         }
  63.         /// <summary>
  64.         /// 壓縮圖片 /// </summary>
  65.         /// <param name="fileStream">圖片流</param>
  66.         /// <param name="quality">壓縮質量0-100之間 數值越大質量越高</param>
  67.         /// <returns></returns>
  68.         private byte[] CompressionImage(Stream fileStream, long quality)
  69.         {
  70.             using (System.Drawing.Image img = System.Drawing.Image.FromStream(fileStream))
  71.             {
  72.                 using (Bitmap bitmap = new Bitmap(img))
  73.                 {
  74.                     ImageCodecInfo CodecInfo =  GetEncoder(img.RawFormat);
  75.                     System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
  76.                     EncoderParameters myEncoderParameters = new EncoderParameters(1);
  77.                     EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, quality);
  78.                     myEncoderParameters.Param[0] = myEncoderParameter;
  79.                     using (MemoryStream ms = new MemoryStream())
  80.                     {
  81.                         bitmap.Save(ms, CodecInfo, myEncoderParameters);
  82.                         myEncoderParameters.Dispose();
  83.                         myEncoderParameter.Dispose();
  84.                         return ms.ToArray();
  85.                     }
  86.                 }
  87.             }
  88.         }

  89.         private static ImageCodecInfo GetEncoder(ImageFormat format)
  90.         {
  91.             ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
  92.             foreach (ImageCodecInfo codec in codecs)
  93.             {
  94.                 if (codec.FormatID == format.Guid)
  95.                 { return codec; }
  96.             }
  97.             return null;
  98.         }  
复制代码






上一篇:急求C语言潮流计算程序
下一篇:文件大小Bytes到KB,MB,GB,TB单位智能转换
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2022-2-7 09:17:41 | 显示全部楼层
多谢分享学习了
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2022-2-7 09:35:42 | 显示全部楼层

多谢分享学习了
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2022-9-24 14:03:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2026-8-30 06:00

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表