欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-04-18 10:51:48
...
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  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  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 = 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  
}