给图片添加水印,解决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;
        }

posted @ 2011-10-21 10:23  园封记忆  阅读(1891)  评论(0编辑  收藏  举报