Home  >  Article  >  Backend Development  >  C# image processing examples (cropping, scaling, clarity, watermark)

C# image processing examples (cropping, scaling, clarity, watermark)

大家讲道理
大家讲道理Original
2016-11-10 09:50:542507browse

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  
{  
  
    public class Image  
    {  
        #region 正方型裁剪并缩放  
   
        ///   
        /// 正方型裁剪  
        /// 以图片中心为轴心,截取正方型,然后等比缩放  
        /// 用于头像处理  
        ///   
        /// 吴剑 2012-08-08  
        /// 原图Stream对象  
        /// 缩略图存放地址  
        /// 指定的边长(正方型)  
        /// 质量(范围0-100)  
        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 自定义裁剪并缩放  
   
        ///   
        /// 指定长宽裁剪  
        /// 按模版比例最大范围的裁剪图片并缩放至模版尺寸  
        ///   
        /// 吴剑 2012-08-08  
        /// 原图Stream对象  
        /// 保存路径  
        /// 最大宽(单位:px)  
        /// 最大高(单位:px)  
        /// 质量(范围0-100)  
        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 等比缩放  
   
        ///   
        /// 图片等比缩放  
        ///   
        /// 吴剑 2012-08-08  
        /// 原图Stream对象  
        /// 缩略图存放地址  
        /// 指定的最大宽度  
        /// 指定的最大高度  
        /// 水印文字(为""表示不使用水印)  
        /// 水印图片路径(为""表示不使用水印)  
        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 其它  
   
        ///   
        /// 判断文件类型是否为WEB格式图片  
        /// (注:JPG,GIF,BMP,PNG)  
        ///   
        /// HttpPostedFile.ContentType  
        ///   
        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  
}

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn