一按大小压缩测试代码:


一测试效果:

一主要代码:

        /// <summary>/// 压缩图片至200 Kb以下/// </summary>/// <param name="img">图片</param>/// <param name="format">图片格式</param>/// <param name="targetLen">压缩后大小</param>/// <param name="srcLen">原始大小</param>/// <returns>压缩后的图片</returns>public Image ZipImage(Image img, ImageFormat format, long targetLen, long srcLen = 0){//设置大小偏差幅度 10kbconst long nearlyLen = 10240;//内存流  如果参数中原图大小没有传递 则使用内存流读取var ms = new MemoryStream();if (0 == srcLen){img.Save(ms, format);srcLen = ms.Length;}//单位 由Kb转为byte 若目标大小高于原图大小,则满足条件退出targetLen *= 1024;if (targetLen > srcLen){ms.SetLength(0);ms.Position = 0;img.Save(ms, format);img = Image.FromStream(ms);return img;}//获取目标大小最低值var exitLen = targetLen - nearlyLen;//初始化质量压缩参数 图像 内存流等var quality = (long)Math.Floor(100.00 * targetLen / srcLen);var parms = new EncoderParameters(1);//获取编码器信息ImageCodecInfo formatInfo = null;var encoders = ImageCodecInfo.GetImageEncoders();foreach (ImageCodecInfo icf in encoders){if (icf.FormatID == format.Guid){formatInfo = icf;break;}}//使用二分法进行查找 最接近的质量参数long startQuality = quality;long endQuality = 100;quality = (startQuality + endQuality) / 2;while (true){//设置质量parms.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);//清空内存流 然后保存图片ms.SetLength(0);ms.Position = 0;img.Save(ms, formatInfo, parms);//若压缩后大小低于目标大小,则满足条件退出if (ms.Length >= exitLen && ms.Length <= targetLen){break;}else if (startQuality >= endQuality) //区间相等无需再次计算{break;}else if (ms.Length < exitLen) //压缩过小,起始质量右移{startQuality = quality;}else //压缩过大 终止质量左移{endQuality = quality;}//重新设置质量参数 如果计算出来的质量没有发生变化,则终止查找。这样是为了避免重复计算情况{start:16,end:18} 和 {start:16,endQuality:17}var newQuality = (startQuality + endQuality) / 2;if (newQuality == quality){break;}quality = newQuality;//Console.WriteLine("start:{0} end:{1} current:{2}", startQuality, endQuality, quality);}img = Image.FromStream(ms);return img;}/// <summary>///获取图片格式/// </summary>/// <param name="img">图片</param>/// <returns>默认返回JPEG</returns>public ImageFormat GetImageFormat(Image img){if (img.RawFormat.Equals(ImageFormat.Jpeg)){return ImageFormat.Jpeg;}if (img.RawFormat.Equals(ImageFormat.Gif)){return ImageFormat.Gif;}if (img.RawFormat.Equals(ImageFormat.Png)){return ImageFormat.Png;}if (img.RawFormat.Equals(ImageFormat.Bmp)){return ImageFormat.Bmp;}return ImageFormat.Jpeg;//根据实际情况选择返回指定格式还是null}

二按尺寸压缩测试代码:


二测试效果:


二主要代码:

     /// <summary>/// 不管多大的图片都能在指定大小picturebox控件中显示/// </summary>/// <param name="bitmap">图片</param>/// <param name="destHeight">picturebox控件高</param>/// <param name="destWidth">picturebox控件宽</param>/// <returns></returns>private Image ZoomImage(Image bitmap, int destHeight, int destWidth){try{System.Drawing.Image sourImage = bitmap;int width = 0, height = 0;//按比例缩放             int sourWidth = sourImage.Width;int sourHeight = sourImage.Height;if (sourHeight > destHeight || sourWidth > destWidth){if ((sourWidth * destHeight) > (sourHeight * destWidth)){width = destWidth;height = (destWidth * sourHeight) / sourWidth;}else{height = destHeight;width = (sourWidth * destHeight) / sourHeight;}}else{width = sourWidth;height = sourHeight;}Bitmap destBitmap = new Bitmap(destWidth, destHeight);Graphics g = Graphics.FromImage(destBitmap);g.Clear(Color.Transparent);//设置画布的描绘质量           g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;g.DrawImage(sourImage, new Rectangle((destWidth - width) / 2, (destHeight - height) / 2, width, height), 0, 0, sourImage.Width, sourImage.Height, GraphicsUnit.Pixel);//g.DrawImage(sourImage, new Rectangle(0, 0, destWidth, destHeight), new Rectangle(0, 0, sourImage.Width, sourImage.Height), GraphicsUnit.Pixel);g.Dispose();//设置压缩质量       System.Drawing.Imaging.EncoderParameters encoderParams = new System.Drawing.Imaging.EncoderParameters();long[] quality = new long[1];quality[0] = 100;System.Drawing.Imaging.EncoderParameter encoderParam = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);encoderParams.Param[0] = encoderParam;sourImage.Dispose();return destBitmap;}catch (Exception ex){return bitmap;}}

注意:

方法一按指定的大小进行压缩,得到的图片尺寸和原图一样

方法二按指定的尺寸进行压缩,得到的图片尺寸是指定的尺寸和原图不一样

附赠一个简易的bitmap防内存溢出方法

     #region Bitmap 避免内存溢出/// <summary>/// 修改Bitmap 尺寸 避免内存溢出/// </summary>/// <param name="bmp">Bitmap原图</param>/// <param name="newW">修改指定宽</param>/// <param name="newH">修改指定高</param>/// <returns></returns>public static Bitmap KiResizeImage(Bitmap bmp, int newW, int newH){//Stopwatch stopwatch = new Stopwatch();//stopwatch.Start();try{Bitmap b = new Bitmap(newW, newH);Graphics g = Graphics.FromImage(b);g.InterpolationMode = InterpolationMode.HighQualityBicubic;g.DrawImage(bmp, new System.Drawing.Rectangle(0, 0, newW, newH), new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);g.Dispose();//stopwatch.Stop();//TimeSpan timespan = stopwatch.Elapsed;//Console.WriteLine("KiResizeImage函数运行时长:" + timespan.TotalMilliseconds);return b;}catch{//stopwatch.Stop();//TimeSpan timespan = stopwatch.Elapsed;//Console.WriteLine("KiResizeImage函数运行时长(异常):" + timespan.TotalMilliseconds);return null;}}#endregion

C# 图片压缩(指定大小压缩和指定尺寸压缩)相关推荐

  1. java jsoup抓取百度图片保存到本地,并压缩到指定大小(可指定宽高或者流大小)

    代码如下: package cn.xyz.commons.utils; import java.awt.image.BufferedImage; import java.io.ByteArrayInp ...

  2. 如何把pdf压缩到指定大小?怎么把pdf压缩到指定大小?

    现在PDF压缩软件有很多,在需要的时候真是能帮大忙,小编在日常工作中,经常会遇到一些体积很大的PDF文件需要压缩,那么pdf太大怎么压缩呢?下面我分享一个我经常用的一个压缩pdf的超级简单的方法: 搜 ...

  3. 压缩pdf大小的方法?怎样压缩pdf大小?pdf文档怎么压缩?pdf文件太大怎么压缩?pdf文件太大怎么压缩成小内存?如何降低pdf文件大小?怎么把pdf文件压缩到指定大小?压缩pdf的简单方法

    pdf在线压缩大小?在工作中需要处理大量PDF文件,我们通常要对PDF文件进行压缩处理.那么问题来了,PDF文件该怎么压缩呢?可能很多人都不知道具体的操作方法,今天要分享给大家的正是PDF压缩的方法, ...

  4. 文档大小超出上传限制怎么办_压缩PDF大小该怎么操作?压缩PDF的软件有哪些?...

    压缩PDF大小该怎么操作?工作中使用的任何设备的储存空间都是有限制的,为了能让自己的电脑储存更多的文件,我们可以将多个PDF文件进行压缩再存储.那么我怎么压缩PDF文件呢?下面就小编就来告诉大家压缩P ...

  5. 【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )

    文章目录 一. 图片压缩 二. 图片文件压缩类型 三. Android 原生 API 提供的质量压缩 四. Android 原生 API 提供的尺寸压缩 一. 图片压缩 图片压缩 : ① 文件压缩 : ...

  6. 图片怎么转换大小?怎么调节图片尺寸大小?

    在遇到需要改图片大小(https://www.yasuotu.com/size)尺寸时,我们会想要通过ps去修改图片尺寸,但是安装和操作都比较复杂,本文就分享给大家一个图片大小转换的在线图片处理工具, ...

  7. 证书扫描件怎么压缩?如何将电子版合同资料压缩变小?

    平时在处理一些工作的时候,经常会需要使用到电子版的证书.合同资料等等,尤其是在与异地的工作人员进行对接时使用尤为频繁,需要把证书.合同等资料扫描到电脑上再进行传输或者上传到某些平台上,那么如果证书扫描 ...

  8. android bitmap 无损压缩,详解Bitmap尺寸压缩与质量压缩

    转载请注明出自flowsky37的博客,尊重他人辛苦劳动! 在Android系统中,关于图片处理的是一个既常见又比较棘手的问题.一个应用中,存在需要展示大量的图片的布局,那我们必须要小心翼翼的处理了, ...

  9. 论坛怎么修改服务器照片大小,C# 如何修改图片的储存大小,比如10MB改为5MB。...

    你是指你希望"程序化"的自动伸缩图片大小吗? 你这个方案的确可以做,但是实现起来有点绕弯,其实目前各大网站做法是这么实现的: 准备2~3种同一个图片的不同大小格式(如完整尺寸70M ...

  10. python更改图片存储大小_python不改变图片尺寸压缩到指定大小

    python不改变图片尺寸压缩到指定大小 import base64 import io import os from PIL import Image from PIL import ImageFi ...

最新文章

  1. WC2018 CCF程序设计教学比赛记事
  2. 深度学习---卷积神经网络(CNN)
  3. 【JAVA基础篇】Socket编程
  4. 计算机调试员高级理论知识试卷,电子计算机设备调试员(高级)考核复习题—理论试题.doc...
  5. 测试Flume-1.6.0写入HDFS(Hadoop-2.7.2)的简单实例
  6. 计算机应用基础精品课程申报表,计算机应用基础精品课程申报表(15页)-原创力文档...
  7. Surface平面计算机
  8. Python 各种库下载地址介绍
  9. C# ABB机器人上位机控制 .net PC SDK开发全流程(通信、控制、日志、二次开发)--Chapter 1
  10. 重庆大学计算机学院研究生奖学金评定准则,重庆大学体育学院研究生学业奖学金评定办法...
  11. First Order Methods in Optimization Ch5. Smoothness and Strong Convexity
  12. 写在1024,致程序员致程序员节致自己
  13. 暗斑怎么形成的_脸上出现暗斑的原因是什么?暗斑怎么形成的
  14. swoft框架,开发遇到基本坑
  15. linux下查看系统内存使用情况的几个命令
  16. warframe怒焚者结合目标_warframe哪些地图有结合目标 | 手游网游页游攻略大全
  17. 2013年3月山东综合性网站及社区网站 综合影响力排名
  18. 解析 float : left
  19. 【转载】阿里云服务器忘记了实例密码怎么办
  20. Citrix 服务器虚拟化之三十二 XenConvert

热门文章

  1. 【JavaScript】分享一个定时到网站上签到/签退的JS脚本
  2. oracle 关键字 enable,Oracle之表示约束状态的关键字Enable/Disable/Validate/Novalidate
  3. [bzoj1812][ioi2005]riv(树上dp)
  4. 【华为OD机试真题 JAVA】找城市
  5. 支付平台服务器被攻击怎么应对?
  6. Slope one—个性化推荐中最简洁的协同过滤算法
  7. Freemarker 模板导出(带图片)
  8. 1-4 云商城项目工程搭建
  9. C++期末课程设计:设计一个学生学籍管理系统
  10. 【matplotlib】20.其他图