• 给图片添加水印,解决GIF添加水印的问题(无法从带有索引像素格式的图像创建 Graphics 对象)


    在网络中发布资源时,比如图片,很多时候需要保护版权,即在图片上显示版权信息。要实现这样的效果,最简单有效的办法就是给图片添加水印(WaterMark),它和人民币中的水印原理一样,不容易涂改。通过制图软件一张一张地添加水印在技术上固然可行,但是工作量庞大,有时无法适应快速反应的要求,在实际操作中很少采用。在ASP.NET网站中,用户可以利用本小节的知识来实现自动添加水印。这里讲述两种水印:图像水印和文字水印。

    图像水印就是在要保护的图片中加入另一个作为水印的图片,即两个图片合二为一,基基本原理就是将一个图片绘制到另一个图片当中,形成一个图片。比如有个风景图片,为了表示版权信息,用户希望在图片的右下角添加说明。

    C#代码
    1.       string file = Server.MapPath("~/04.jpg");   
    2.        string mark = Server.MapPath("~/mark.jpg");   

    •        // 需要添加水印的图像   

    •        System.Drawing.Image img = System.Drawing.Image.FromFile(file);   
    •        // 水印图像   
    •        System.Drawing.Image imgMark = System.Drawing.Image.FromFile(mark);   
    •        // 创建Graphics对象   
    •        Graphics g = Graphics.FromImage(img);   
    •        // 将水印图像绘制到目标图像中去   
    •        g.DrawImage(imgMark, img.Width - imgMark.Width, img.Height - imgMark.Height);   
    •        // 原书示例代码中没有,没有这句则在非IE浏览器会出错   
    •        Response.ContentType = "image/JPEG";   
    •        //将图像加载到Response中   
    •        img.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);   
    •        g.Dispose();   

    这里可以用DrawString方法来向图片绘制文本。为了使文字不至于影响图片效果,可以将其颜色设置为谈灰色,并适当调整透明度,参考代码如下:

    C#代码
    1.        string file = Server.MapPath("~/04.jpg");   
    2.         System.Drawing.Image img = System.Drawing.Image.FromFile(file);   
    3.         // 写文字的笔刷,透明度为100,蓝色   
    4.         Brush b = new SolidBrush(Color.FromArgb(100, Color.Blue));   
    5.         // 字体设置   
    6.         FontFamily ff = new FontFamily("华文琥珀");   
    7.         Font f = new Font(ff, 50, FontStyle.Bold);   
    8.         // 文字区域左上角坐标   
    9.         float x = 50;   
    10.         float y = 50;   
    11.         Graphics g = Graphics.FromImage(img);   
    12.         //设置Graphics对象   
    13.         g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;   
    14.         g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;   
    15.         g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;   
    16.         // 文字   
    17.         g.DrawString("流星剑制作", f, b, new PointF(x, y));   
    18.         // 原书示例代码中没有,没有这句则在非IE浏览器会出错   
    19.         Response.ContentType = "image/JPEG";   
    20.         //将图像加载到Response中   
    21.         img.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);   
    22.         g.Dispose();  

    如果在添加文印过程中报“无法从带有索引像素格式的图像创建 Graphics 对象 ”

    c#代码:

            /// <summary>
            /// 写入图像水印
            /// </summary>
            /// <param name="str">水印字符串</param>
            /// <param name="filePath">原图片文件名(含路径)</param>
            /// <param name="savePath">水印加入后图片文件名(含路径)</param>
            /// <param name="_iHeight">水印文字区域高度</param>
            /// <param name="_iWidth">水印文字区域宽度</param>
            /// <returns></returns>
            ///  
            public string CreateBackImage(string str, string filePath, string savePath, int _iHeight, int _iWidth)
            {
                System.Drawing.Image img = System.Drawing.Image.FromFile(filePath);
                Bitmap bmp = new Bitmap(img.Width, img.Height);
                Graphics g = Graphics.FromImage(bmp);
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                g.DrawImage(img, 0, 0, img.Width, img.Height);
                Font font = new Font("宋体", 16);
                Color mycolor = ColorTranslator.FromHtml("#9BB032");
                Brush brush = new SolidBrush(mycolor);
                g.DrawString(str, font, brush,img.Width - _iHeight, img.Height - _iWidth);
                g.Dispose();
                bmp.Save(savePath);
                return savePath;
            }

  • 相关阅读:
    2020牛客多校第二场A.All with Pairs hash+kmp
    2020杭电多校第三场
    2020牛客多校第六场K.K-Bag (思维?)
    2020牛客多校第六场 G.Grid Coloring 构造
    2020杭电多校第一场
    2020牛客暑期多校训练营(第三场)D.Points Construction Problem 构造
    ACM模板_axiomofchoice
    关于deque的行为分析
    Codeforces Round #665 (Div. 2) 题解 (CDEF)
    Codeforces Global Round 10 题解 (DEF)
  • 原文地址:https://www.cnblogs.com/fanyf/p/2219924.html
Copyright © 2020-2023  润新知