加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 17:52:10 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Drawing; using System.Drawing.Drawing2D; us

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

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,initHeight,initHeight);  
                        Rectangle toR = new Rectangle(0,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,initWidth);  
                        //画图  
                        pickedG.DrawImage(initImage,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,side,side),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,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,maxWidth,maxHeight),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);//原图裁剪定位  
                    Rectangle toR = new Rectangle(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,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,pickedImage.Width,pickedImage.Height),System.Drawing.GraphicsUnit.Pixel);  
  
                    //关键质量控制  
                    //获取系统编码类型数组,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,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,255,0);  
                                colorMap.NewColor = Color.FromArgb(0,0);  
                                ColorMap[] remapTable = { colorMap };  
                                imgAttributes.SetRemapTable(remapTable,ColorAdjustType.Bitmap);  
  
                                float[][] colorMatrixElements = {   
                                   new float[] {1.0f,0.0f,0.0f},new float[] {0.0f,1.0f,0.5f,//透明度:0.5  
                                   new float[] {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),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,newImage.Width,newImage.Height),System.Drawing.GraphicsUnit.Pixel);  
  
                //文字水印  
                if (watermarkText != "")  
                {  
                    using (System.Drawing.Graphics gWater = System.Drawing.Graphics.FromImage(newImage))  
                    {  
                        System.Drawing.Font fontWater = new Font("宋体",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,new Rectangle(newImage.Width - wrImage.Width,newImage.Height - wrImage.Height,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  
}

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读