PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

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

大家讲道理
大家讲道理 原创
2016-11-10 09:50:54 2389浏览

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  
}

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。