| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
cgdf
10年前发布

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

using System;    using System.Collections.Generic;    using System.Text;    using System.IO;    using System.Drawing;    using System.Drawing.Drawing2D;    using System.Drawing.Imaging;        namespace WuJian.Common    {        /// <summary>        /// 图片处理        /// http://www.cnblogs.com/wu-jian/        ///         /// 吴剑 2011-02-20 创建        /// 吴剑 2012-08-08 修改        /// </summary>        public class Image        {            #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 (!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 (!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               #region 其它                /// <summary>            /// 判断文件类型是否为WEB格式图片            /// (注:JPG,GIF,BMP,PNG)            /// </summary>            /// <param name="contentType">HttpPostedFile.ContentType</param>            /// <returns></returns>            public static bool IsWebImage(string contentType)            {                if (contentType == "image/pjpeg" || contentType == "image/jpeg" || contentType == "image/gif" || contentType == "image/bmp" || contentType == "image/png")                {                    return true;                }                else                {                    return false;                }            }               #endregion            }//end class    }