读书人

C# 这个步骤截取后图片为什么会比原图

发布时间: 2012-09-05 15:19:35 作者: rapoo

C# 这个方法截取后图片为什么会比原图还大?
截图是缩小截取的,可压缩后比原图还要大,大家帮我看下这个方法

C# code
 /// <summary>       /// 方法入口       /// </summary>       /// <param name="strOldPic">源图文件名(包括路径)</param>       /// <param name="strNewPic">缩小后保存为文件名(包括路径)</param>       /// <param name="intWidth">缩小至宽度</param>       /// <param name="CropHeight">裁剪高度</param>       /// <param name="AQuality">图片保存质量(1-100之间)</param>       public string SmallPic1(string strOldPic, string strNewPic, float intWidth, int CropHeight, int AQuality)        {            System.Drawing.Bitmap objPic, objNewPic;            try            {                                objPic = new System.Drawing.Bitmap(strOldPic);                float ImgWidth = objPic.Width;//获取图宽度                float ImgHeight = objPic.Height;                float intHeight = (intWidth / ImgWidth) * ImgHeight; //计算出相同比例高度                 int ConfirmHeight = Convert.ToInt32(intHeight);                int Width = Convert.ToInt32(intWidth);                objNewPic = new System.Drawing.Bitmap(objPic, Width, ConfirmHeight);// 生成流                                 return DoConvert(objNewPic, strNewPic, objNewPic.Width, CropHeight, AQuality);//裁剪并保存                        }            catch (Exception exp) { error.LogError("按比例裁剪图片,自动计算高度 出错:", exp); return "压缩失败"; }            finally            {                objPic = null;                objNewPic = null;            }        } /// <summary>           /// 裁剪并缩放           /// </summary>           /// <param name="ASrcFileName">源图片信息</param>           /// <param name="ADestFileName">目标文件名称</param>           /// <param name="AWidth">转换后的宽度(像素)</param>           /// <param name="AHeight">转换后的高度(像素)</param>           /// <param name="AQuality">保存质量(取值在1-100之间)</param>          public  string DoConvert(Bitmap ASrcFileName, string ADestFileName, int AWidth, int AHeight, int AQuality)        {            try            {                Bitmap ASrcImg = ASrcFileName;//赋值图片信息                               //Image ASrcImg = Image.FromFile(ASrcFileName);//获取图片信息                //if (ASrcImg.Width <= AWidth && ASrcImg.Height <= AHeight)                //{//图片的高宽均小于目标高宽,直接保存                   //    ASrcImg.Save(ADestFileName);                //    return;                //}                double ADestRate = AWidth * 1.0 / AHeight;                              double ASrcRate = ASrcImg.Width * 1.0 / ASrcImg.Height;                                //裁剪后的宽度                   double ACutWidth = ASrcRate > ADestRate ? (ASrcImg.Height * ADestRate) : ASrcImg.Width;                               //裁剪后的高度                   double ACutHeight = ASrcRate > ADestRate ? ASrcImg.Height : (ASrcImg.Width / ADestRate);                                //待裁剪的矩形区域,根据原图片的中心进行裁剪                   Rectangle AFromRect = new Rectangle(Convert.ToInt32((ASrcImg.Width - ACutWidth) / 2), Convert.ToInt32((ASrcImg.Height - ACutHeight) / 2), (int)ACutWidth, (int)ACutHeight);                               //目标矩形区域                   Rectangle AToRect = new Rectangle(0, 0, AWidth, AHeight);                   Image ADestImg = new Bitmap(AWidth, AHeight);                              Graphics ADestGraph = Graphics.FromImage(ADestImg);                              ADestGraph.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;                              ADestGraph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;                               ADestGraph.DrawImage(ASrcImg, AToRect, AFromRect, GraphicsUnit.Pixel);                                //获取系统image/jpeg编码信息                   ImageCodecInfo[] AInfos = ImageCodecInfo.GetImageEncoders();                ImageCodecInfo AInfo = null;                                    foreach (ImageCodecInfo i in AInfos)                {                    AInfo = i;                                                 break;                }                //设置转换后图片质量参数                   EncoderParameters AParams = new EncoderParameters(1);                AParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)AQuality);                            ADestImg.Save(ADestFileName, AInfo, AParams); //保存                    ADestImg.Dispose();                return "压缩成功";            }            catch (Exception ex) { error.LogError("保存压缩图片出错:", ex); return "压缩失败"; }        } 



[解决办法]
尺寸
/// <param name="intWidth">缩小至宽度</param>
/// <param name="CropHeight">裁剪高度</param>
搞小一点
[解决办法]
ADestGraph.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
ADestGraph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
你这里换一下参数试试,把高质量的参数换一下

读书人网 >C#

热点推荐