C#实现无损压缩图片代码示例

 更新时间:2022年04月19日 11:32:25   作者:農碼一生  
这篇文章介绍了C#实现无损压缩图片的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一般在web应用中,对客户端提交上来的图片肯定需要进行压缩的。尤其是比较大的图片,如果不经过压缩会导致页面变的很大,打开速度比较慢,影响用户体验,所以一般会将图片进行压缩。

代码实现:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ImageCompress
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 无损压缩图片
        /// </summary>
        /// <param name="sFile">原图片地址(包含图片名称)</param>
        /// <param name="dFile">压缩后保存图片地址(包含图片名称)</param>
        /// <param name="flag">压缩质量(数字越小压缩率越高)1-100</param>
        /// <param name="size">压缩后图片的最大大小</param>
        /// <param name="sfsc">是否是第一次调用</param>
        /// <returns></returns>
        public static bool CompressImage(string sFile, string dFile, int flag = 90, int size = 300, bool sfsc = true)
        {
            //如果是第一次调用,原始图像的大小小于要压缩的大小,则直接复制文件,并且返回true
            FileInfo firstFileInfo = new FileInfo(sFile);
            if (sfsc == true && firstFileInfo.Length < size * 1024)
            {
                firstFileInfo.CopyTo(dFile);
                return true;
            }
            Image iSource = Image.FromFile(sFile);
            ImageFormat tFormat = iSource.RawFormat;
            int dHeight = iSource.Height / 2;
            int dWidth = iSource.Width / 2;
            int sW = 0, sH = 0;
            //按比例缩放
            Size tem_size = new Size(iSource.Width, iSource.Height);
            if (tem_size.Width > dHeight || tem_size.Width > dWidth)
            {
                if ((tem_size.Width * dHeight) > (tem_size.Width * 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 = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.InterpolationMode = System.Drawing.Drawing2D.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是压缩后的新路径
                    FileInfo fi = new FileInfo(dFile);
                    if (fi.Length > 1024 * size)
                    {
                        flag = flag - 10;
                        CompressImage(sFile, dFile, flag, size, false);
                    }
                }
                else
                {
                    ob.Save(dFile, tFormat);
                }
                return true;
            }
            catch
            {
                return false;
            }
            finally
            {
                iSource.Dispose();
                ob.Dispose();
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            string sfile = @"C:\Users\Mingliang_wang\Pictures\Screenshots\s_test.jpg";
            string dfile = @"C:\Users\Mingliang_wang\Pictures\Screenshots\d_test.jpg";
            CompressImage(sfile,dfile);
        }
    }
}

到此这篇关于C#实现无损压缩图片的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#实现小截屏软件功能

    C#实现小截屏软件功能

    这篇文章主要为大家详细介绍了C#实现截图软件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 解析C#拼接Json串的几种方法

    解析C#拼接Json串的几种方法

    本文主要介绍了C#拼接Json串的几种方法,主要包括了4种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C# 调用C++写的dll的实现方法

    C# 调用C++写的dll的实现方法

    C#调用C++的非托管类的dll其实很简单基本就是固定的调用格式,有需要的朋友可以参考一下
    2013-10-10
  • 关于c#中枚举类型支持显示中文的扩展说明

    关于c#中枚举类型支持显示中文的扩展说明

    需求 : 枚举类型在界面显示的时候可以显示相应的中文信息, 这样界面对用户友好 . 场景 : 在一些业务中涉及到审核功能的时候, 往往有这几个状态 :未送审 , 审核中 ,审核通过, 驳回 . 这个时候我们会定义一个枚举类型来描述 :
    2013-03-03
  • C#根据Word模版生成Word文件

    C#根据Word模版生成Word文件

    这篇文章主要为大家详细介绍了C#根据Word模版生成Word文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Unity3D利用DoTween实现卡牌翻转效果

    Unity3D利用DoTween实现卡牌翻转效果

    这篇文章主要为大家详细介绍了Unity3D利用DoTween实现卡牌翻转效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • C#编程实现四舍五入、向上及下取整的方法

    C#编程实现四舍五入、向上及下取整的方法

    这篇文章主要介绍了C#编程实现四舍五入、向上及下取整的方法,涉及C#数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • C#前端验证和后台验证代码实例

    C#前端验证和后台验证代码实例

    这篇文章主要介绍了C#前端验证和后台验证代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • C#短消息提示窗口位置及窗口大小详解

    C#短消息提示窗口位置及窗口大小详解

    在我们的生活中无论是使用QQ,360安全卫士等软件的过程中,经常会遇到从右下方的托盘处弹出一个消息提示窗,比如新闻,产品更新等内容,下面这篇文章主要给大家介绍了关于C#短消息提示窗口位置及窗口大小的相关资料,需要的朋友可以参考下
    2022-12-12
  • C#中把FastReport.Net报表控件的数据保存到数据库

    C#中把FastReport.Net报表控件的数据保存到数据库

    这篇文章介绍了在数据库中保存FastReport.Net报表的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06

最新评论