一般在web应用中,对客户端提交上来的图片肯定需要进行压缩的。尤其是比较大的图片,如果不经过压缩会导致页面变的很大,打开速度比较慢,当然了如果是需要高质量的图片也得需要生产缩略图。

一般在web应用中,对客户端提交上来的图片肯定需要进行压缩的。尤其是比较大的图片,如果不经过压缩会导致页面变的很大,打开速度比较慢,当然了如果是需要高质量的图片也得需要生产缩略图。

下面贴出我自己琢磨的图片压缩算法,首先这个是未经优化的简单实现:

代码如下:
public static System.Drawing.Image GetImageThumb(System.Drawing.Image sourceImg, int width, int height)
        {
            System.Drawing.Image targetImg = new System.Drawing.Bitmap(width, height);
            using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(targetImg))
            {
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
                g.DrawImage(sourceImg, new System.Drawing.Rectangle(0, 0, width, height), new System.Drawing.Rectangle(0, 0, sourceImg.Width, sourceImg.Height), System.Drawing.GraphicsUnit.Pixel);
                g.Dispose();
            }
            return targetImg;
        }

这个方法比较简单,用到的是高质量压缩。经过这个方法压缩后,200K的图片只能压缩到160k左右。经过改写代码实现了如下的方法:

代码如下:
public Bitmap GetImageThumb(Bitmap mg, Size newSize)
        {
            double ratio = 0d;
            double myThumbWidth = 0d;
            double myThumbHeight = 0d;
            int x = 0;
            int y = 0;

Bitmap bp;

if ((mg.Width / Convert.ToDouble(newSize.Width)) > (mg.Height /
            Convert.ToDouble(newSize.Height)))
                ratio = Convert.ToDouble(mg.Width) / Convert.ToDouble(newSize.Width);
            else
                ratio = Convert.ToDouble(mg.Height) / Convert.ToDouble(newSize.Height);
            myThumbHeight = Math.Ceiling(mg.Height / ratio);
            myThumbWidth = Math.Ceiling(mg.Width / ratio);

Size thumbSize = new Size((int)newSize.Width, (int)newSize.Height);
            bp = new Bitmap(newSize.Width, newSize.Height);
            x = (newSize.Width - thumbSize.Width) / 2;
            y = (newSize.Height - thumbSize.Height);
            System.Drawing.Graphics g = Graphics.FromImage(bp);
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.PixelOffsetMode = PixelOffsetMode.HighQuality;
            Rectangle rect = new Rectangle(x, y, thumbSize.Width, thumbSize.Height);
            g.DrawImage(mg, rect, 0, 0, mg.Width, mg.Height, GraphicsUnit.Pixel);

return bp;

}

这样实现的压缩使压缩率大幅度上升。其实代码并没有变多少,最主要的是在保存的时候要是用jpg格式,如果不指定格式,默认使用的是png格式。

 

下面这个是根据设置图片质量数值来压缩图片写的的方法:

代码如下:
public static bool GetPicThumbnail(string sFile, string outPath, int flag)
        {
            System.Drawing.Image iSource = System.Drawing.Image.FromFile(sFile);
            ImageFormat tFormat = iSource.RawFormat;

//以下代码为保存图片时,设置压缩质量 
            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)
                {
                    iSource.Save(outPath, jpegICIinfo, ep);//dFile是压缩后的新路径 
                }
                else
                {
                    iSource.Save(outPath, tFormat);
                }
                return true;
            }
            catch
            {
                return false;
            }
            finally
            {
                iSource.Dispose();
                iSource.Dispose();
            }
        }

C#图片压缩的实现方法相关推荐

  1. 【Android 内存优化】Android 原生 API 图片压缩原理 ( Bitmap_compress 方法解析 | Skia 二维图形库 | libjpeg 函数库 | libpng 函数库 )

    文章目录 一. 图片质量压缩方法 二. Skia 二维图形库 三. libjpeg.libpng 函数库引入 在博客 [Android 内存优化]图片文件压缩 ( Android 原生 API 提供的 ...

  2. 照片太大了怎么改小kb?图片压缩在线处理方法

    我们经常会在使用图片的过程中遇到图片过大影响使用的问题,那么照片太大了怎么改小kb?今天给大家介绍一款压缩图片在线工具,简单好用,一起来看看吧! 1.打开起步网选择上传图片,功能支持jpg.png.g ...

  3. 手机图片压缩大小的方法,用什么软件压缩

    手机图片怎么压缩大小,现在很多的手机拍出来的图片文件都在几兆,这样的图片文件是不能够上传到一些网站中的,今天小编就为大家介绍一下手机图片压缩大小的方法以及压缩软件的使用方法. 使用软件:迅捷压缩软件 ...

  4. 如何压缩jpg大小?jpg图片压缩的简单方法

    我们日常的学习.工作中,经常需要收发很多jpg图片.当这些jpg图片体积过大的时候,不仅会减缓我们传输的速度,还会占用大量的电脑储存空间.那么如何将图片压缩(https://www.yasuotu.c ...

  5. 图片太大上传不了怎么缩小?jpg图片压缩大小的方法

    自媒体平台上传jpg图片通常都会有大小限制,为了可以正常使用,我们需要把过大的jpg格式图片压缩变小.想要实现压缩jpg图片的方法有很多,今天就介绍一种比较简单的,利用在线jpg压缩(在线jpg压缩免 ...

  6. iOS中图片压缩的常见方法

       开发中经常会碰到从手机相册中选择图片的需求,选择图片这个过程是一个消耗性能的过程,取决于手机图片的大小,如果手机像素非常高,图片的尺寸非常大,这个时候就会变得很消耗性能,比如一张图片5兆,这个时 ...

  7. 批量图片压缩怎么做?分享三招图片压缩怎么操作的方法

      因为工作需要在电脑上保存大量图片的小伙伴们,是不是图片一下子把电脑内存占满了,可是要怎么做才能减少图片的占用空间呢?我们可以把图片压缩,这样子就可以保存更多的图片啦.还不清楚批量图片压缩怎么做的小 ...

  8. 怎么压缩jpg图片的大小,图片压缩的四个方法

    怎么压缩jpg图片的大小?在我们办公中会遇到图片过大的情况,这种情况很常见,比如上传到网站的图片大小受到限制,文件过大需要压缩一下图片的大小等等,一般刚入职场的小伙伴们可能会调整一下图片的尺寸,通过发 ...

  9. 【Android 内存优化】Android 原生 API 图片压缩原理 ( 哈夫曼编码开关 | 哈夫曼编码原理 | libjpeg-turbo 函数库 )

    文章目录 一. 哈夫曼编码开关 二. 哈夫曼编码原理 三. libjpeg-turbo 函数库 四. libjpeg-turbo 函数库下载 [Android 内存优化]图片文件压缩 ( Androi ...

最新文章

  1. GitHub 官方终于出 App 了!
  2. php实现支付宝支付接口,PHP实现个人支付宝支付开发(二)
  3. php连接基础方法怎么查询数据库,php基础之连接mysql数据库和查询数据
  4. 【微信小程序企业级开发教程】快递查询实例
  5. Xcode7.2如何真机调试iOS 9.3的设备
  6. Spring Cloud Alibaba:Sentinel 熔断降级
  7. 以主干开发作为持续交付的基础
  8. Windows Server 2012体验之卸载辅助域控制器
  9. LeetCode 93. 复原IP地址(回溯)
  10. 中班音乐计算机反思,中班音乐教学反思
  11. 使用SQL Coalesce函数查询数据
  12. Boost shared_from_this用法
  13. 栈的典型应用 —— 延迟缓冲
  14. 压电式加速计matlab,低频压电加速度传感器的噪声特性及信号处理方法研究
  15. 计算机网络放大器的作用,运算放大器
  16. 基于javaweb+jsp的户籍管理系统(JavaWeb MySQL JSP Bootstrap Servlet SSM SpringBoot)
  17. Hbuilder We're sorry
  18. SPSS 探索性因素分析(图文+数据集)【SPSS 033期】
  19. AcWing 145 超市
  20. 狂奔的“智慧校园”:监控学生的生意,会持续吗?

热门文章

  1. celery 可视化_在Flask中使用Celery进行多任务分布执行
  2. tensorflow对应的python版本_详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
  3. JavaEE是什么?
  4. pyqt5教程9:Widgets组件
  5. 汇编编程计算机流程图,汇编程序怎么做流程图?
  6. 非确定性算法_使用最坏情况提高基于MPC的避障算法对参数不确定性的鲁棒性
  7. windows下 conda常用使用指令
  8. 卡尔曼滤波器原理和matlab实现
  9. 数据结构实验之二叉树六:哈夫曼编码
  10. Resilience4j-轻量级熔断框架