C#图片处理示例(裁剪,缩放,清晰度,水印)

来源:互联网 发布:win10下装mac os双系统 编辑:程序博客网 时间:2024/05/17 01:57

原文地址:http://www.cnblogs.com/wu-jian/archive/2011/02/21/1959382.html


 #region 正方型裁剪并缩放        /// <summary>        /// 正方型裁剪        /// 以图片中心为轴心,截取正方型,然后等比缩放        /// 用于头像处理        /// </summary>        /// <remarks>吴剑 2012-08-08</remarks>        /// <param name="fromFile">原图Stream对象</param>        /// <param name="fileSaveUrl">缩略图存放地址</param>        /// <param name="side">指定的边长(正方型)</param>        /// <param name="quality">质量(范围0-100)</param>        public static void CutForSquare(System.IO.Stream fromFile, string fileSaveUrl, int side, int quality)        {            //创建目录            string dir = Path.GetDirectoryName(fileSaveUrl);            if (dir != null && dir != "")            {                if (!Directory.Exists(dir))                    Directory.CreateDirectory(dir);            }            //原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)            System.Drawing.Image initImage = System.Drawing.Image.FromStream(fromFile, true);            //原图宽高均小于模版,不作处理,直接保存            if (initImage.Width <= side && initImage.Height <= side)            {                initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);            }            else            {                //原始图片的宽、高                int initWidth = initImage.Width;                int initHeight = initImage.Height;                //非正方型先裁剪为正方型                if (initWidth != initHeight)                {                    //截图对象                    System.Drawing.Image pickedImage = null;                    System.Drawing.Graphics pickedG = null;                    //宽大于高的横图                    if (initWidth > initHeight)                    {                        //对象实例化                        pickedImage = new System.Drawing.Bitmap(initHeight, initHeight);                        pickedG = System.Drawing.Graphics.FromImage(pickedImage);                        //设置质量                        pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;                        pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;                        //定位                        Rectangle fromR = new Rectangle((initWidth - initHeight) / 2, 0, initHeight, initHeight);                        Rectangle toR = new Rectangle(0, 0, initHeight, initHeight);                        //画图                        pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);                        //重置宽                        initWidth = initHeight;                    }                    //高大于宽的竖图                    else                    {                        //对象实例化                        pickedImage = new System.Drawing.Bitmap(initWidth, initWidth);                        pickedG = System.Drawing.Graphics.FromImage(pickedImage);                        //设置质量                        pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;                        pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;                        //定位                        Rectangle fromR = new Rectangle(0, (initHeight - initWidth) / 2, initWidth, initWidth);                        Rectangle toR = new Rectangle(0, 0, initWidth, initWidth);                        //画图                        pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);                        //重置高                        initHeight = initWidth;                    }                    //将截图对象赋给原图                    initImage = (System.Drawing.Image)pickedImage.Clone();                    //释放截图资源                    pickedG.Dispose();                    pickedImage.Dispose();                }                //缩略图对象                System.Drawing.Image resultImage = new System.Drawing.Bitmap(side, side);                System.Drawing.Graphics resultG = System.Drawing.Graphics.FromImage(resultImage);                //设置质量                resultG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;                resultG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;                //用指定背景色清空画布                resultG.Clear(Color.White);                //绘制缩略图                resultG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, side, side), new System.Drawing.Rectangle(0, 0, initWidth, initHeight), System.Drawing.GraphicsUnit.Pixel);                //关键质量控制                //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff                ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();                ImageCodecInfo ici = null;                foreach (ImageCodecInfo i in icis)                {                    if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")                    {                        ici = i;                    }                }                EncoderParameters ep = new EncoderParameters(1);                ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);                //保存缩略图                resultImage.Save(fileSaveUrl, ici, ep);                //释放关键质量控制所用资源                ep.Dispose();                //释放缩略图资源                resultG.Dispose();                resultImage.Dispose();                //释放原始图片资源                initImage.Dispose();            }        }        #endregion        #region 自定义裁剪并缩放        /// <summary>        /// 指定长宽裁剪        /// 按模版比例最大范围的裁剪图片并缩放至模版尺寸        /// </summary>        /// <remarks>吴剑 2012-08-08</remarks>        /// <param name="fromFile">原图Stream对象</param>        /// <param name="fileSaveUrl">保存路径</param>        /// <param name="maxWidth">最大宽(单位:px)</param>        /// <param name="maxHeight">最大高(单位:px)</param>        /// <param name="quality">质量(范围0-100)</param>        public static void CutForCustom(System.IO.Stream fromFile, string fileSaveUrl, int maxWidth, int maxHeight, int quality)        {            //从文件获取原始图片,并使用流中嵌入的颜色管理信息            System.Drawing.Image initImage = System.Drawing.Image.FromStream(fromFile, true);            //原图宽高均小于模版,不作处理,直接保存            if (initImage.Width <= maxWidth && initImage.Height <= maxHeight)            {                initImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);            }            else            {                //模版的宽高比例                double templateRate = (double)maxWidth / maxHeight;                //原图片的宽高比例                double initRate = (double)initImage.Width / initImage.Height;                //原图与模版比例相等,直接缩放                if (templateRate == initRate)                {                    //按模版大小生成最终图片                    System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);                    System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);                    templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;                    templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;                    templateG.Clear(Color.White);                    templateG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);                    templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);                }                //原图与模版比例不等,裁剪后缩放                else                {                    //裁剪对象                    System.Drawing.Image pickedImage = null;                    System.Drawing.Graphics pickedG = null;                    //定位                    Rectangle fromR = new Rectangle(0, 0, 0, 0);//原图裁剪定位                    Rectangle toR = new Rectangle(0, 0, 0, 0);//目标定位                    //宽为标准进行裁剪                    if (templateRate > initRate)                    {                        //裁剪对象实例化                        pickedImage = new System.Drawing.Bitmap(initImage.Width, (int)System.Math.Floor(initImage.Width / templateRate));                        pickedG = System.Drawing.Graphics.FromImage(pickedImage);                        //裁剪源定位                        fromR.X = 0;                        fromR.Y = (int)System.Math.Floor((initImage.Height - initImage.Width / templateRate) / 2);                        fromR.Width = initImage.Width;                        fromR.Height = (int)System.Math.Floor(initImage.Width / templateRate);                        //裁剪目标定位                        toR.X = 0;                        toR.Y = 0;                        toR.Width = initImage.Width;                        toR.Height = (int)System.Math.Floor(initImage.Width / templateRate);                    }                    //高为标准进行裁剪                    else                    {                        pickedImage = new System.Drawing.Bitmap((int)System.Math.Floor(initImage.Height * templateRate), initImage.Height);                        pickedG = System.Drawing.Graphics.FromImage(pickedImage);                        fromR.X = (int)System.Math.Floor((initImage.Width - initImage.Height * templateRate) / 2);                        fromR.Y = 0;                        fromR.Width = (int)System.Math.Floor(initImage.Height * templateRate);                        fromR.Height = initImage.Height;                        toR.X = 0;                        toR.Y = 0;                        toR.Width = (int)System.Math.Floor(initImage.Height * templateRate);                        toR.Height = initImage.Height;                    }                    //设置质量                    pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;                    pickedG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;                    //裁剪                    pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);                    //按模版大小生成最终图片                    System.Drawing.Image templateImage = new System.Drawing.Bitmap(maxWidth, maxHeight);                    System.Drawing.Graphics templateG = System.Drawing.Graphics.FromImage(templateImage);                    templateG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;                    templateG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;                    templateG.Clear(Color.White);                    templateG.DrawImage(pickedImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, pickedImage.Width, pickedImage.Height), System.Drawing.GraphicsUnit.Pixel);                    //关键质量控制                    //获取系统编码类型数组,包含了jpeg,bmp,png,gif,tiff                    ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();                    ImageCodecInfo ici = null;                    foreach (ImageCodecInfo i in icis)                    {                        if (i.MimeType == "image/jpeg" || i.MimeType == "image/bmp" || i.MimeType == "image/png" || i.MimeType == "image/gif")                        {                            ici = i;                        }                    }                    EncoderParameters ep = new EncoderParameters(1);                    ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);                    //保存缩略图                    templateImage.Save(fileSaveUrl, ici, ep);                    //templateImage.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);                    //释放资源                    templateG.Dispose();                    templateImage.Dispose();                    pickedG.Dispose();                    pickedImage.Dispose();                }            }            //释放资源            initImage.Dispose();        }        #endregion        #region 等比缩放        /// <summary>        /// 图片等比缩放        /// </summary>        /// <remarks>吴剑 2012-08-08</remarks>        /// <param name="fromFile">原图Stream对象</param>        /// <param name="savePath">缩略图存放地址</param>        /// <param name="targetWidth">指定的最大宽度</param>        /// <param name="targetHeight">指定的最大高度</param>        /// <param name="watermarkText">水印文字(为""表示不使用水印)</param>        /// <param name="watermarkImage">水印图片路径(为""表示不使用水印)</param>        public static void ZoomAuto(System.IO.Stream fromFile, string savePath, System.Double targetWidth, System.Double targetHeight, string watermarkText, string watermarkImage)        {            //创建目录            string dir = Path.GetDirectoryName(savePath);            if (dir != null && dir != "")            {                if (!Directory.Exists(dir))                    Directory.CreateDirectory(dir);            }            //原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)            System.Drawing.Image initImage = System.Drawing.Image.FromStream(fromFile, true);            //原图宽高均小于模版,不作处理,直接保存            if (initImage.Width <= targetWidth && initImage.Height <= targetHeight)            {                //文字水印                if (watermarkText != "")                {                    using (System.Drawing.Graphics gWater = System.Drawing.Graphics.FromImage(initImage))                    {                        System.Drawing.Font fontWater = new Font("黑体", 10);                        System.Drawing.Brush brushWater = new SolidBrush(Color.White);                        gWater.DrawString(watermarkText, fontWater, brushWater, 10, 10);                        gWater.Dispose();                    }                }                //透明图片水印                if (watermarkImage != "")                {                    if (File.Exists(watermarkImage))                    {                        //获取水印图片                        using (System.Drawing.Image wrImage = System.Drawing.Image.FromFile(watermarkImage))                        {                            //水印绘制条件:原始图片宽高均大于或等于水印图片                            if (initImage.Width >= wrImage.Width && initImage.Height >= wrImage.Height)                            {                                Graphics gWater = Graphics.FromImage(initImage);                                //透明属性                                ImageAttributes imgAttributes = new ImageAttributes();                                ColorMap colorMap = new ColorMap();                                colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);                                colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);                                ColorMap[] remapTable = { colorMap };                                imgAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);                                float[][] colorMatrixElements = {                                    new float[] {1.0f,  0.0f,  0.0f,  0.0f, 0.0f},                                   new float[] {0.0f,  1.0f,  0.0f,  0.0f, 0.0f},                                   new float[] {0.0f,  0.0f,  1.0f,  0.0f, 0.0f},                                   new float[] {0.0f,  0.0f,  0.0f,  0.5f, 0.0f},//透明度:0.5                                   new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f}                                };                                ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);                                imgAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);                                gWater.DrawImage(wrImage, new Rectangle(initImage.Width - wrImage.Width, initImage.Height - wrImage.Height, wrImage.Width, wrImage.Height), 0, 0, wrImage.Width, wrImage.Height, GraphicsUnit.Pixel, imgAttributes);                                gWater.Dispose();                            }                            wrImage.Dispose();                        }                    }                }                //保存                initImage.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);            }            else            {                //缩略图宽、高计算                double newWidth = initImage.Width;                double newHeight = initImage.Height;                //宽大于高或宽等于高(横图或正方)                if (initImage.Width > initImage.Height || initImage.Width == initImage.Height)                {                    //如果宽大于模版                    if (initImage.Width > targetWidth)                    {                        //宽按模版,高按比例缩放                        newWidth = targetWidth;                        newHeight = initImage.Height * (targetWidth / initImage.Width);                    }                }                //高大于宽(竖图)                else                {                    //如果高大于模版                    if (initImage.Height > targetHeight)                    {                        //高按模版,宽按比例缩放                        newHeight = targetHeight;                        newWidth = initImage.Width * (targetHeight / initImage.Height);                    }                }                //生成新图                //新建一个bmp图片                System.Drawing.Image newImage = new System.Drawing.Bitmap((int)newWidth, (int)newHeight);                //新建一个画板                System.Drawing.Graphics newG = System.Drawing.Graphics.FromImage(newImage);                //设置质量                newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;                newG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;                //置背景色                newG.Clear(Color.White);                //画图                newG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, newImage.Width, newImage.Height), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);                //文字水印                if (watermarkText != "")                {                    using (System.Drawing.Graphics gWater = System.Drawing.Graphics.FromImage(newImage))                    {                        System.Drawing.Font fontWater = new Font("宋体", 10);                        System.Drawing.Brush brushWater = new SolidBrush(Color.White);                        gWater.DrawString(watermarkText, fontWater, brushWater, 10, 10);                        gWater.Dispose();                    }                }                //透明图片水印                if (watermarkImage != "")                {                    if (File.Exists(watermarkImage))                    {                        //获取水印图片                        using (System.Drawing.Image wrImage = System.Drawing.Image.FromFile(watermarkImage))                        {                            //水印绘制条件:原始图片宽高均大于或等于水印图片                            if (newImage.Width >= wrImage.Width && newImage.Height >= wrImage.Height)                            {                                Graphics gWater = Graphics.FromImage(newImage);                                //透明属性                                ImageAttributes imgAttributes = new ImageAttributes();                                ColorMap colorMap = new ColorMap();                                colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);                                colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);                                ColorMap[] remapTable = { colorMap };                                imgAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);                                float[][] colorMatrixElements = {                                    new float[] {1.0f,  0.0f,  0.0f,  0.0f, 0.0f},                                   new float[] {0.0f,  1.0f,  0.0f,  0.0f, 0.0f},                                   new float[] {0.0f,  0.0f,  1.0f,  0.0f, 0.0f},                                   new float[] {0.0f,  0.0f,  0.0f,  0.5f, 0.0f},//透明度:0.5                                   new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f}                                };                                ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);                                imgAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);                                gWater.DrawImage(wrImage, new Rectangle(newImage.Width - wrImage.Width, newImage.Height - wrImage.Height, wrImage.Width, wrImage.Height), 0, 0, wrImage.Width, wrImage.Height, GraphicsUnit.Pixel, imgAttributes);                                gWater.Dispose();                            }                            wrImage.Dispose();                        }                    }                }                //保存缩略图                newImage.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);                //释放资源                newG.Dispose();                newImage.Dispose();                initImage.Dispose();            }        }        #endregion


0 0