C# 图片压缩处理

今天老大让做一个图片压缩功能,自己在网上找了一些解决方法,也同时对方法进行了提炼!

在下面的代码中会有一个字段Encoder.Quality 字段,这个对应的有个一个values是神奇的值

MSDN解释是:Quality 类别将指定的图像压缩级别。 在用于构造 EncoderParameter, ,质量类别的有用值的范围是从 0 到 100。 指定的数字越,越高压缩和图像质量也因此越低。 零将为您提供最低的图像质量和 100 最高。

当将一个参数传递给图像编码器中时,将参数封装在 EncoderParameter 对象。 域中的一个 EncoderParameter 对象是指定的参数的类别的 GUID。 使用的静态字段 Encoder 类来检索 Encoder ,其中包含参数的所需类别。

内置的图像编码器 GDI+ 接收属于多个类别的参数。 下表列出了所有类别,每个类别关联的 GUID。

这里写图片描述

里面有6个方法,如下

方法作用方法名
按质量比和尺寸收缩呗数,生成缩略图,保存为另外路劲getThumImage(String sourceFile, long quality, int multiple, String outputFile)
按质量比和尺寸收缩呗数,生成缩略图;保存在同一路径getThumImage(String sourceFile, long quality, int multiple)
按图片尺寸大小压缩图片 ,保存在不同路径ImageByMultiple(String sourceFile, int multiple, String outputFile)
按图片尺寸大小压缩图片 ,保存在同一路径ImageByMultiple(String sourceFile, int multiple)
质量压缩比,保存在不同一路径ImageByQuality(String sourceFile, int quality, String outputFile)
按质量压缩比压缩图片,保存在同一路径ImageByQuality(String sourceFile, int quality)
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            GetFileInfo(@"D:\tupian");
            //string pathPerc = @"D:\Koala.jpg";
            //string source = @"D:\Koala.jpg";
            ////if (!File.Exists(pathPerc))
            ////{
            ////    File.Create(pathPerc).Close();
            ////}
            ////else
            ////{
            ////    File.Delete(pathPerc);
            ////    File.Create(pathPerc).Close();
            ////}
            //getThumImage(source, 18, 3, pathPerc);  
        }

        private void GetFileInfo(string filePath)
        {
            DirectoryInfo directoryInfo = new DirectoryInfo(filePath);
            try
            {
                foreach (DirectoryInfo childDirectoryInfo in directoryInfo.GetDirectories())
                {
                    string name = childDirectoryInfo.Name.ToString();
                    GetFileInfo(filePath + "\\" + childDirectoryInfo.Name.ToString());
                }
                foreach (FileInfo fileInfo in directoryInfo.GetFiles())
                {
                    //Length单位为bytes,    1k=1024b
                    if (fileInfo.Length > 400 * 1024)
                    {
                        //  getThumImage(fileInfo.FullName, 100, 1, fileInfo.FullName);
                        //   ImageByQuality(fileInfo.FullName, 18);
                        // ImageByMultiple(fileInfo.FullName,1);

                        FixSize(fileInfo.FullName, 200, 100, fileInfo.FullName);
                    }
                }
            }
            catch
            {

            }
        }



        #region 调用图片处理的方法

        /// <summary>  
        /// 按质量比和尺寸收缩呗数,生成缩略图,保存为另外路劲
        /// </summary>  
        /// <param name="sourceFile">原始图片文件</param>  
        /// <param name="quality">质量压缩比</param>  
        /// <param name="multiple">收缩倍数</param>  
        /// <param name="outputFile">输出文件名</param>  
        /// <returns>成功返回true,失败则返回false</returns>  
        public static bool getThumImage(String sourceFile, long quality, int multiple, String outputFile)
        {
            bool flag = false;
            try
            {
                flag = ThumImage(sourceFile, quality, multiple, outputFile);
            }
            catch
            {
                flag = false;
            }
            return flag;
        }

        /**/
        /// <summary>  
        /// 按质量比和尺寸收缩呗数,生成缩略图;保存在同一路径
        /// </summary>  
        /// <param name="sourceFile">原始图片文件</param>  
        /// <param name="quality">质量压缩比</param>  
        /// <param name="multiple">收缩倍数</param>  
        /// <param name="outputFile">输出文件名</param>  
        /// <returns>成功返回true,失败则返回false</returns>  
        public static bool getThumImage(String sourceFile, long quality, int multiple)
        {
            bool flag = false;
            try
            {
                flag = ThumImage(sourceFile, quality, multiple, sourceFile);
            }
            catch
            {
                flag = false;
            }
            return flag;
        }

        /// <summary>  
        /// 按图片尺寸大小压缩图片  ,保存在不同路径
        /// </summary>  
        /// <param name="sourceFile">原始图片文件</param>  
        /// <param name="multiple">收缩倍数</param>  
        /// <returns>成功返回true,失败则返回false</returns>  
        public static bool ImageByMultiple(String sourceFile, int multiple, String outputFile)
        {
            bool flag = false;
            try
            {
                flag = ThumImageByMultiple(sourceFile, multiple, outputFile);
            }
            catch
            {
                flag = false;
            }
            return flag;
        }


        /// <summary>  
        ///  按图片尺寸大小压缩图片  ,保存在同一路径
        /// </summary>  
        /// <param name="multiple">收缩倍数</param>  
        /// <returns>成功返回true,失败则返回false</returns>  
        public static bool ImageByMultiple(String sourceFile, int multiple)
        {
            bool flag = false;
            try
            {
                flag = ThumImageByMultiple(sourceFile, multiple, sourceFile);
            }
            catch
            {
                flag = false;
            }
            return flag;
        }


        /// <summary>  
        /// 质量压缩比,保存在不同一路径
        /// </summary>  
        /// <param name="sourceFile">原始图片文件</param>  
        /// <param name="quality">质量压缩比</param>  
        /// <returns>成功返回true,失败则返回false</returns>  
        public static bool ImageByQuality(String sourceFile, int quality, String outputFile)
        {
            bool flag = false;
            try
            {
                flag = ThumImageByQuality(sourceFile, quality, outputFile);
            }
            catch
            {
                flag = false;
            }
            return flag;
        }

        /// <summary>  
        /// 按质量压缩比压缩图片,保存在同一路径
        /// </summary>  
        /// <param name="sourceFile">原始图片文件</param>  
        /// <param name="quality">质量压缩比</param>  
        /// <returns>成功返回true,失败则返回false</returns>  
        public static bool ImageByQuality(String sourceFile, int quality)
        {
            bool flag = false;
            try
            {
                flag = ThumImageByQuality(sourceFile, quality, sourceFile);
            }
            catch
            {
                flag = false;
            }
            return flag;
        }
        #endregion

        #region 调用图片处理具体方法


        /// <summary>
        /// 按照图片质量生成图片,
        /// </summary>
        /// <param name="sourceFile">原始图片文件</param>  
        /// <param name="quality">质量压缩比</param>  
        /// <param name="outputFile">输出文件名</param>  
        /// <returns>成功返回true,失败则返回false</returns>  
        private static bool ThumImageByQuality(String sourceFile, long quality, String outputFile)
        {
            bool flag = false;
            try
            {
                long imageQuality = quality;
                Bitmap sourceImage = new Bitmap(sourceFile);
                ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/jpeg");
                System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
                EncoderParameters myEncoderParameters = new EncoderParameters(1);
                EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, imageQuality);
                myEncoderParameters.Param[0] = myEncoderParameter;
                float xWidth = sourceImage.Width;
                float yWidth = sourceImage.Height;
                Bitmap newImage = new Bitmap((int)(xWidth), (int)(yWidth));
                Graphics g = Graphics.FromImage(newImage);
                g.DrawImage(sourceImage, 0, 0, xWidth, yWidth);
                sourceImage.Dispose();
                g.Dispose();
                newImage.Save(outputFile, myImageCodecInfo, myEncoderParameters);
                flag = true;
            }
            catch
            {
                flag = false;
            }
            return flag;

        }


        /// <summary>
        /// 生成缩略图
        /// </summary>
        /// <param name="sourceFile">原始图片文件</param>  
        /// <param name="quality">质量压缩比</param>  
        /// <param name="multiple">收缩倍数</param>  
        /// <param name="outputFile">输出文件名</param>  
        /// <returns>成功返回true,失败则返回false</returns>  
        private static bool ThumImage(String sourceFile, long quality, int multiple, String outputFile)
        {
            bool flag = false;
            try
            {
                long imageQuality = quality;
                Bitmap sourceImage = new Bitmap(sourceFile);
                ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/jpeg");
                System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
                EncoderParameters myEncoderParameters = new EncoderParameters(1);
                EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, imageQuality);
                myEncoderParameters.Param[0] = myEncoderParameter;
                float xWidth = sourceImage.Width;
                float yWidth = sourceImage.Height;
                Bitmap newImage = new Bitmap((int)(xWidth / multiple), (int)(yWidth / multiple));
                Graphics g = Graphics.FromImage(newImage);
                g.DrawImage(sourceImage, 0, 0, xWidth / multiple, yWidth / multiple);
                sourceImage.Dispose();
                g.Dispose();
                newImage.Save(outputFile, myImageCodecInfo, myEncoderParameters);
                flag = true;
            }
            catch
            {
                flag = false;
            }
            return flag;

        }

        /// <summary>  
        /// 按图片尺寸大小压缩图片  
        /// </summary>  
        /// <param name="sourceFile">原始图片文件</param>  
        /// <param name="multiple">收缩倍数</param>  
        /// <param name="outputFile">输出文件名</param>  
        /// <returns>成功返回true,失败则返回false</returns>  
        public static bool ThumImageByMultiple(String sourceFile, int multiple, String outputFile)
        {
            try
            {
                Bitmap sourceImage = new Bitmap(sourceFile);
                ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/jpeg");
                float xWidth = sourceImage.Width;
                float yWidth = sourceImage.Height;
                Bitmap newImage = new Bitmap((int)(xWidth / multiple), (int)(yWidth / multiple));
                Graphics g = Graphics.FromImage(newImage);
                g.DrawImage(sourceImage, 0, 0, xWidth / multiple, yWidth / multiple);
                sourceImage.Dispose();
                g.Dispose();
                newImage.Save(outputFile);
                return true;
            }
            catch
            {
                return false;
            }
        }



        /// <summary>  
        /// 按图片尺寸大小压缩图片  
        /// </summary>  
        /// <param name="sourceFile">原始图片文件</param>  
        /// <param name="multiple">收缩倍数</param>  
        /// <param name="outputFile">输出文件名</param>  
        /// <returns>成功返回true,失败则返回false</returns>  
        public static bool FixSize(String sourceFile, int xWidth, int yWidth, String outputFile)
        {
            try
            {
                Bitmap sourceImage = new Bitmap(sourceFile);
                ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/jpeg");
                Bitmap newImage = new Bitmap((int)(xWidth), (int)(yWidth));
                Graphics g = Graphics.FromImage(newImage);
                g.DrawImage(sourceImage, 0, 0, xWidth, yWidth);
                sourceImage.Dispose();
                g.Dispose();
                newImage.Save(outputFile);
                return true;
            }
            catch
            {
                return false;
            }
        }
        #endregion getThumImage


        /// <summary>  
        /// 获取图片编码信息  
        /// </summary>  
        private static ImageCodecInfo GetEncoderInfo(String mimeType)
        {
            int j;
            ImageCodecInfo[] encoders;
            encoders = ImageCodecInfo.GetImageEncoders();
            for (j = 0; j < encoders.Length; ++j)
            {
                if (encoders[j].MimeType == mimeType)
                    return encoders[j];
            }
            return null;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值