zoukankan      html  css  js  c++  java
  • C# ASP.NET MVC 图片盗链 加水印 的问题

    ImageClass

    using System;
    using System.Collections;
    using System.IO;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.Drawing.Drawing2D;
    
    namespace CZBK.ItcastProject.Common
    {
        public class ImageClass
        {
            public ImageClass()
            { }
    
            #region 缩略图
            /// <summary>
            /// 生成缩略图
            /// </summary>
            /// <param name="originalImagePath">源图路径(物理路径)</param>
            /// <param name="thumbnailPath">缩略图路径(物理路径)</param>
            /// <param name="width">缩略图宽度</param>
            /// <param name="height">缩略图高度</param>
            /// <param name="mode">生成缩略图的方式</param>    
            public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
            {
                System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);
    
                int towidth = width;
                int toheight = height;
    
                int x = 0;
                int y = 0;
                int ow = originalImage.Width;
                int oh = originalImage.Height;
    
                switch (mode)
                {
                    case "HW":  //指定高宽缩放(可能变形)                
                        break;
                    case "W":   //指定宽,高按比例                    
                        toheight = originalImage.Height * width / originalImage.Width;
                        break;
                    case "H":   //指定高,宽按比例
                        towidth = originalImage.Width * height / originalImage.Height;
                        break;
                    case "Cut": //指定高宽裁减(不变形)                
                        if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
                        {
                            oh = originalImage.Height;
                            ow = originalImage.Height * towidth / toheight;
                            y = 0;
                            x = (originalImage.Width - ow) / 2;
                        }
                        else
                        {
                            ow = originalImage.Width;
                            oh = originalImage.Width * height / towidth;
                            x = 0;
                            y = (originalImage.Height - oh) / 2;
                        }
                        break;
                    default:
                        break;
                }
    
                //新建一个bmp图片
                System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);
    
                //新建一个画板
                System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);
    
                //设置高质量插值法
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
    
                //设置高质量,低速度呈现平滑程度
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    
                //清空画布并以透明背景色填充
                g.Clear(System.Drawing.Color.Transparent);
    
                //在指定位置并且按指定大小绘制原图片的指定部分
                //第一个:对哪张图片进行操作。
                //二:画多么大。
                //三:画那块区域。
                g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight), new System.Drawing.Rectangle(x, y, ow, oh), System.Drawing.GraphicsUnit.Pixel);
    
                try
                {
                    //以jpg格式保存缩略图
                    bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
                }
                catch (System.Exception e)
                {
                    throw e;
                }
                finally
                {
                    originalImage.Dispose();
                    bitmap.Dispose();
                    g.Dispose();
                }
            }
            #endregion
    
            #region 图片水印
            /// <summary>
            /// 图片水印处理方法
            /// </summary>
            /// <param name="path">需要加载水印的图片路径(绝对路径)</param>
            /// <param name="waterpath">水印图片(绝对路径)</param>
            /// <param name="location">水印位置(传送正确的代码)</param>
            public static string ImageWatermark(string path, string waterpath, string location)
            {
                string kz_name = Path.GetExtension(path);
                if (kz_name == ".jpg" || kz_name == ".bmp" || kz_name == ".jpeg")
                {
                    DateTime time = DateTime.Now;
                    string filename = "" + time.Year.ToString() + time.Month.ToString() + time.Day.ToString() + time.Hour.ToString() + time.Minute.ToString() + time.Second.ToString() + time.Millisecond.ToString();
                    Image img = Bitmap.FromFile(path);
                    Image waterimg = Image.FromFile(waterpath);
                    Graphics g = Graphics.FromImage(img);
                    ArrayList loca = GetLocation(location, img, waterimg);
                    g.DrawImage(waterimg, new Rectangle(int.Parse(loca[0].ToString()), int.Parse(loca[1].ToString()), waterimg.Width, waterimg.Height));
                    waterimg.Dispose();
                    g.Dispose();
                    string newpath = Path.GetDirectoryName(path) + filename + kz_name;
                    img.Save(newpath);
                    img.Dispose();
                    File.Copy(newpath, path, true);
                    if (File.Exists(newpath))
                    {
                        File.Delete(newpath);
                    }
                }
                return path;
            }
    
            /// <summary>
            /// 图片水印位置处理方法
            /// </summary>
            /// <param name="location">水印位置</param>
            /// <param name="img">需要添加水印的图片</param>
            /// <param name="waterimg">水印图片</param>
            private static ArrayList GetLocation(string location, Image img, Image waterimg)
            {
                ArrayList loca = new ArrayList();
                int x = 0;
                int y = 0;
    
                if (location == "LT")
                {
                    x = 10;
                    y = 10;
                }
                else if (location == "T")
                {
                    x = img.Width / 2 - waterimg.Width / 2;
                    y = img.Height - waterimg.Height;
                }
                else if (location == "RT")
                {
                    x = img.Width - waterimg.Width;
                    y = 10;
                }
                else if (location == "LC")
                {
                    x = 10;
                    y = img.Height / 2 - waterimg.Height / 2;
                }
                else if (location == "C")
                {
                    x = img.Width / 2 - waterimg.Width / 2;
                    y = img.Height / 2 - waterimg.Height / 2;
                }
                else if (location == "RC")
                {
                    x = img.Width - waterimg.Width;
                    y = img.Height / 2 - waterimg.Height / 2;
                }
                else if (location == "LB")
                {
                    x = 10;
                    y = img.Height - waterimg.Height;
                }
                else if (location == "B")
                {
                    x = img.Width / 2 - waterimg.Width / 2;
                    y = img.Height - waterimg.Height;
                }
                else
                {
                    x = img.Width - waterimg.Width;
                    y = img.Height - waterimg.Height;
                }
                loca.Add(x);
                loca.Add(y);
                return loca;
            }
            #endregion
    
            #region 文字水印
            /// <summary>
            /// 文字水印处理方法
            /// </summary>
            /// <param name="path">图片路径(绝对路径)</param>
            /// <param name="size">字体大小</param>
            /// <param name="letter">水印文字</param>
            /// <param name="color">颜色</param>
            /// <param name="location">水印位置</param>
            public static string LetterWatermark(string path, int size, string letter, Color color, string location)
            {
                #region
    
                string kz_name = Path.GetExtension(path);
                if (kz_name == ".jpg" || kz_name == ".bmp" || kz_name == ".jpeg")
                {
                    DateTime time = DateTime.Now;
                    string filename = "" + time.Year.ToString() + time.Month.ToString() + time.Day.ToString() + time.Hour.ToString() + time.Minute.ToString() + time.Second.ToString() + time.Millisecond.ToString();
                    Image img = Bitmap.FromFile(path);
                    Graphics gs = Graphics.FromImage(img);
                    ArrayList loca = GetLocation(location, img, size, letter.Length);
                    Font font = new Font("宋体", size);
                    Brush br = new SolidBrush(color);
                    gs.DrawString(letter, font, br, float.Parse(loca[0].ToString()), float.Parse(loca[1].ToString()));
                    gs.Dispose();
                    string newpath = Path.GetDirectoryName(path) + filename + kz_name;
                    img.Save(newpath);
                    img.Dispose();
                    File.Copy(newpath, path, true);
                    if (File.Exists(newpath))
                    {
                        File.Delete(newpath);
                    }
                }
                return path;
    
                #endregion
            }
    
            /// <summary>
            /// 文字水印位置的方法
            /// </summary>
            /// <param name="location">位置代码</param>
            /// <param name="img">图片对象</param>
            /// <param name="width">宽(当水印类型为文字时,传过来的就是字体的大小)</param>
            /// <param name="height">高(当水印类型为文字时,传过来的就是字符的长度)</param>
            private static ArrayList GetLocation(string location, Image img, int width, int height)
            {
                #region
    
                ArrayList loca = new ArrayList();  //定义数组存储位置
                float x = 10;
                float y = 10;
    
                if (location == "LT")
                {
                    loca.Add(x);
                    loca.Add(y);
                }
                else if (location == "T")
                {
                    x = img.Width / 2 - (width * height) / 2;
                    loca.Add(x);
                    loca.Add(y);
                }
                else if (location == "RT")
                {
                    x = img.Width - width * height;
                }
                else if (location == "LC")
                {
                    y = img.Height / 2;
                }
                else if (location == "C")
                {
                    x = img.Width / 2 - (width * height) / 2;
                    y = img.Height / 2;
                }
                else if (location == "RC")
                {
                    x = img.Width - height;
                    y = img.Height / 2;
                }
                else if (location == "LB")
                {
                    y = img.Height - width - 5;
                }
                else if (location == "B")
                {
                    x = img.Width / 2 - (width * height) / 2;
                    y = img.Height - width - 5;
                }
                else
                {
                    x = img.Width - width * height;
                    y = img.Height - width - 5;
                }
                loca.Add(x);
                loca.Add(y);
                return loca;
    
                #endregion
            }
            #endregion
    
            #region 调整光暗
            /// <summary>
            /// 调整光暗
            /// </summary>
            /// <param name="mybm">原始图片</param>
            /// <param name="width">原始图片的长度</param>
            /// <param name="height">原始图片的高度</param>
            /// <param name="val">增加或减少的光暗值</param>
            public Bitmap LDPic(Bitmap mybm, int width, int height, int val)
            {
                Bitmap bm = new Bitmap(width, height);//初始化一个记录经过处理后的图片对象
                int x, y, resultR, resultG, resultB;//x、y是循环次数,后面三个是记录红绿蓝三个值的
                Color pixel;
                for (x = 0; x < width; x++)
                {
                    for (y = 0; y < height; y++)
                    {
                        pixel = mybm.GetPixel(x, y);//获取当前像素的值
                        resultR = pixel.R + val;//检查红色值会不会超出[0, 255]
                        resultG = pixel.G + val;//检查绿色值会不会超出[0, 255]
                        resultB = pixel.B + val;//检查蓝色值会不会超出[0, 255]
                        bm.SetPixel(x, y, Color.FromArgb(resultR, resultG, resultB));//绘图
                    }
                }
                return bm;
            }
            #endregion
    
            #region 反色处理
            /// <summary>
            /// 反色处理
            /// </summary>
            /// <param name="mybm">原始图片</param>
            /// <param name="width">原始图片的长度</param>
            /// <param name="height">原始图片的高度</param>
            public Bitmap RePic(Bitmap mybm, int width, int height)
            {
                Bitmap bm = new Bitmap(width, height);//初始化一个记录处理后的图片的对象
                int x, y, resultR, resultG, resultB;
                Color pixel;
                for (x = 0; x < width; x++)
                {
                    for (y = 0; y < height; y++)
                    {
                        pixel = mybm.GetPixel(x, y);//获取当前坐标的像素值
                        resultR = 255 - pixel.R;//反红
                        resultG = 255 - pixel.G;//反绿
                        resultB = 255 - pixel.B;//反蓝
                        bm.SetPixel(x, y, Color.FromArgb(resultR, resultG, resultB));//绘图
                    }
                }
                return bm;
            }
            #endregion
    
            #region 浮雕处理
            /// <summary>
            /// 浮雕处理
            /// </summary>
            /// <param name="oldBitmap">原始图片</param>
            /// <param name="Width">原始图片的长度</param>
            /// <param name="Height">原始图片的高度</param>
            public Bitmap FD(Bitmap oldBitmap, int Width, int Height)
            {
                Bitmap newBitmap = new Bitmap(Width, Height);
                Color color1, color2;
                for (int x = 0; x < Width - 1; x++)
                {
                    for (int y = 0; y < Height - 1; y++)
                    {
                        int r = 0, g = 0, b = 0;
                        color1 = oldBitmap.GetPixel(x, y);
                        color2 = oldBitmap.GetPixel(x + 1, y + 1);
                        r = Math.Abs(color1.R - color2.R + 128);
                        g = Math.Abs(color1.G - color2.G + 128);
                        b = Math.Abs(color1.B - color2.B + 128);
                        if (r > 255) r = 255;
                        if (r < 0) r = 0;
                        if (g > 255) g = 255;
                        if (g < 0) g = 0;
                        if (b > 255) b = 255;
                        if (b < 0) b = 0;
                        newBitmap.SetPixel(x, y, Color.FromArgb(r, g, b));
                    }
                }
                return newBitmap;
            }
            #endregion
    
            #region 拉伸图片
            /// <summary>
            /// 拉伸图片
            /// </summary>
            /// <param name="bmp">原始图片</param>
            /// <param name="newW">新的宽度</param>
            /// <param name="newH">新的高度</param>
            public static Bitmap ResizeImage(Bitmap bmp, int newW, int newH)
            {
                try
                {
                    Bitmap bap = new Bitmap(newW, newH);
                    Graphics g = Graphics.FromImage(bap);
                    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    g.DrawImage(bap, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bap.Width, bap.Height), GraphicsUnit.Pixel);
                    g.Dispose();
                    return bap;
                }
                catch
                {
                    return null;
                }
            }
            #endregion
    
            #region 滤色处理
            /// <summary>
            /// 滤色处理
            /// </summary>
            /// <param name="mybm">原始图片</param>
            /// <param name="width">原始图片的长度</param>
            /// <param name="height">原始图片的高度</param>
            public Bitmap FilPic(Bitmap mybm, int width, int height)
            {
                Bitmap bm = new Bitmap(width, height);//初始化一个记录滤色效果的图片对象
                int x, y;
                Color pixel;
    
                for (x = 0; x < width; x++)
                {
                    for (y = 0; y < height; y++)
                    {
                        pixel = mybm.GetPixel(x, y);//获取当前坐标的像素值
                        bm.SetPixel(x, y, Color.FromArgb(0, pixel.G, pixel.B));//绘图
                    }
                }
                return bm;
            }
            #endregion
    
            #region 左右翻转
            /// <summary>
            /// 左右翻转
            /// </summary>
            /// <param name="mybm">原始图片</param>
            /// <param name="width">原始图片的长度</param>
            /// <param name="height">原始图片的高度</param>
            public Bitmap RevPicLR(Bitmap mybm, int width, int height)
            {
                Bitmap bm = new Bitmap(width, height);
                int x, y, z; //x,y是循环次数,z是用来记录像素点的x坐标的变化的
                Color pixel;
                for (y = height - 1; y >= 0; y--)
                {
                    for (x = width - 1, z = 0; x >= 0; x--)
                    {
                        pixel = mybm.GetPixel(x, y);//获取当前像素的值
                        bm.SetPixel(z++, y, Color.FromArgb(pixel.R, pixel.G, pixel.B));//绘图
                    }
                }
                return bm;
            }
            #endregion
    
            #region 上下翻转
            /// <summary>
            /// 上下翻转
            /// </summary>
            /// <param name="mybm">原始图片</param>
            /// <param name="width">原始图片的长度</param>
            /// <param name="height">原始图片的高度</param>
            public Bitmap RevPicUD(Bitmap mybm, int width, int height)
            {
                Bitmap bm = new Bitmap(width, height);
                int x, y, z;
                Color pixel;
                for (x = 0; x < width; x++)
                {
                    for (y = height - 1, z = 0; y >= 0; y--)
                    {
                        pixel = mybm.GetPixel(x, y);//获取当前像素的值
                        bm.SetPixel(x, z++, Color.FromArgb(pixel.R, pixel.G, pixel.B));//绘图
                    }
                }
                return bm;
            }
            #endregion
    
            #region 压缩图片
            /// <summary>
            /// 压缩到指定尺寸
            /// </summary>
            /// <param name="oldfile">原文件</param>
            /// <param name="newfile">新文件</param>
            public bool Compress(string oldfile, string newfile)
            {
                try
                {
                    System.Drawing.Image img = System.Drawing.Image.FromFile(oldfile);
                    System.Drawing.Imaging.ImageFormat thisFormat = img.RawFormat;
                    Size newSize = new Size(100, 125);
                    Bitmap outBmp = new Bitmap(newSize.Width, newSize.Height);
                    Graphics g = Graphics.FromImage(outBmp);
                    g.CompositingQuality = CompositingQuality.HighQuality;
                    g.SmoothingMode = SmoothingMode.HighQuality;
                    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    g.DrawImage(img, new Rectangle(0, 0, newSize.Width, newSize.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
                    g.Dispose();
                    EncoderParameters encoderParams = new EncoderParameters();
                    long[] quality = new long[1];
                    quality[0] = 100;
                    EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
                    encoderParams.Param[0] = encoderParam;
                    ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
                    ImageCodecInfo jpegICI = null;
                    for (int x = 0; x < arrayICI.Length; x++)
                        if (arrayICI[x].FormatDescription.Equals("JPEG"))
                        {
                            jpegICI = arrayICI[x]; //设置JPEG编码
                            break;
                        }
                    img.Dispose();
                    if (jpegICI != null) outBmp.Save(newfile, System.Drawing.Imaging.ImageFormat.Jpeg);
                    outBmp.Dispose();
                    return true;
                }
                catch
                {
                    return false;
                }
            }
            #endregion
    
            #region 图片灰度化
            public Color Gray(Color c)
            {
                int rgb = Convert.ToInt32((double)(((0.3 * c.R) + (0.59 * c.G)) + (0.11 * c.B)));
                return Color.FromArgb(rgb, rgb, rgb);
            }
            #endregion
    
            #region 转换为黑白图片
            /// <summary>
            /// 转换为黑白图片
            /// </summary>
            /// <param name="mybt">要进行处理的图片</param>
            /// <param name="width">图片的长度</param>
            /// <param name="height">图片的高度</param>
            public Bitmap BWPic(Bitmap mybm, int width, int height)
            {
                Bitmap bm = new Bitmap(width, height);
                int x, y, result; //x,y是循环次数,result是记录处理后的像素值
                Color pixel;
                for (x = 0; x < width; x++)
                {
                    for (y = 0; y < height; y++)
                    {
                        pixel = mybm.GetPixel(x, y);//获取当前坐标的像素值
                        result = (pixel.R + pixel.G + pixel.B) / 3;//取红绿蓝三色的平均值
                        bm.SetPixel(x, y, Color.FromArgb(result, result, result));
                    }
                }
                return bm;
            }
            #endregion
    
            #region 获取图片中的各帧
            /// <summary>
            /// 获取图片中的各帧
            /// </summary>
            /// <param name="pPath">图片路径</param>
            /// <param name="pSavePath">保存路径</param>
            public void GetFrames(string pPath, string pSavedPath)
            {
                Image gif = Image.FromFile(pPath);
                FrameDimension fd = new FrameDimension(gif.FrameDimensionsList[0]);
                int count = gif.GetFrameCount(fd); //获取帧数(gif图片可能包含多帧,其它格式图片一般仅一帧)
                for (int i = 0; i < count; i++)    //以Jpeg格式保存各帧
                {
                    gif.SelectActiveFrame(fd, i);
                    gif.Save(pSavedPath + "\frame_" + i + ".jpg", ImageFormat.Jpeg);
                }
            }
            #endregion
        }
    }
    View Code

    传智的例子

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Linq;
    using System.Web;
    
    namespace CZBK.ItcastProject.WebApp._2015_5_27
    {
        /// <summary>
        /// MakeImage 的摘要说明
        /// </summary>
        public class MakeImage : IHttpHandler
        {
    
            public void ProcessRequest(HttpContext context)
            {
                context.Response.ContentType = "text/html";
              //给用户创建一张图片,并且把这张图片保存。
                //创建一个画布.
                using (Bitmap map = new Bitmap(300,400))
                {
                    //给画布创建一个画笔。
                    using (Graphics g = Graphics.FromImage(map))
                    {
                        g.Clear(Color.Gray);
                        //再画布上写字。
    
                        //1:写的是什么字
                        //2:字体的样式,字体大小等。
                        //3:用什么颜色填充字体
                        //4:在画布的什么位置写字
                        g.DrawString("传智播客", new Font("黑体", 14.0f, FontStyle.Bold), Brushes.Red, new PointF(150,200));
    
                        //将画布保存成一张图片.
                        string fileName = Guid.NewGuid().ToString();
                        //将画布保存成一张图片,并且指定图片的类型
                        map.Save(context.Request.MapPath("/ImageUpload/"+fileName+".jpg"),System.Drawing.Imaging.ImageFormat.Jpeg);
                        context.Response.Write("<html><body><img src='/ImageUpload/"+fileName+".jpg'/></body></html>");
                    }
                }
    
            }
    
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
        }
    }
     public static void ZoomAuto(System.IO.Stream fromFile, string savePath, System.Double targetWidth, System.Double targetHeight, string waterText, string waterImage,out int NewWidth,out int NewHeight)
            {
                //创建目录
                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 (waterText != "")
                    {
                        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(waterText, fontWater, brushWater, 10, 10);
                            gWater.Dispose();
                        }
                    }                //透明图片水印
                    if (waterImage != "")
                    {
                        if (File.Exists(waterImage))
                        {
                            //获取水印图片
                            using (System.Drawing.Image wrImage = System.Drawing.Image.FromFile(waterImage))
                            {
                                //水印绘制条件:原始图片宽高均大于或等于水印图片
                                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();
                            }
                        }
                    }
                    NewWidth = initImage.Width;
                    NewHeight = initImage.Height;
                    //保存
                    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);
                    NewWidth = (int)newWidth;
                    NewHeight = (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 (waterText != "")
                    {
                        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(waterText, fontWater, brushWater, 10, 10);
                            gWater.Dispose();
                        }
                    }                //透明图片水印
                    if (waterImage != "")
                    {
                        if (File.Exists(waterImage))
                        {
                            //获取水印图片
                            using (System.Drawing.Image wrImage = System.Drawing.Image.FromFile(waterImage))
                            {
                                //水印绘制条件:原始图片宽高均大于或等于水印图片
                                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();
                            }
                        }
                    }                //保存缩略图                try {
                        newImage.Save(savePath, System.Drawing.Imaging.ImageFormat.Png);
                    }
                    catch(Exception ex)
                    {
                        throw new Exception("系统出错误了,请重新尝试或者换一张照片");
                    }
                                    //释放资源
                    newG.Dispose();
                    newImage.Dispose();
                    initImage.Dispose();
                }
            }
  • 相关阅读:
    HYSBZ 3813 奇数国
    HYSBZ 4419 发微博
    HYSBZ 1079 着色方案
    HYSBZ 3506 排序机械臂
    HYSBZ 3224 Tyvj 1728 普通平衡树
    Unity 3D,地形属性
    nginx 的naginx 种包含include关键字
    Redis 出现NOAUTH Authentication required解决方案
    mysql 8.0出现 Public Key Retrieval is not allowed
    修改jar包里的源码时候需要注意的问题
  • 原文地址:https://www.cnblogs.com/xiaoshi657/p/5364855.html
Copyright © 2011-2022 走看看