给图片添加水印,解决GIF添加水印的问题(无法从带有索引像素格式的图像创建 Graphics 对象)
在网络中发布资源时,比如图片,很多时候需要保护版权,即在图片上显示版权信息。要实现这样的效果,最简单有效的办法就是给图片添加水印(WaterMark),它和人民币中的水印原理一样,不容易涂改。通过制图软件一张一张地添加水印在技术上固然可行,但是工作量庞大,有时无法适应快速反应的要求,在实际操作中很少采用。在ASP.NET网站中,用户可以利用本小节的知识来实现自动添加水印。这里讲述两种水印:图像水印和文字水印。
图像水印就是在要保护的图片中加入另一个作为水印的图片,即两个图片合二为一,基基本原理就是将一个图片绘制到另一个图片当中,形成一个图片。比如有个风景图片,为了表示版权信息,用户希望在图片的右下角添加说明。
- string file = Server.MapPath("~/04.jpg");
- 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方法来向图片绘制文本。为了使文字不至于影响图片效果,可以将其颜色设置为谈灰色,并适当调整透明度,参考代码如下:
- string file = Server.MapPath("~/04.jpg");
- System.Drawing.Image img = System.Drawing.Image.FromFile(file);
- // 写文字的笔刷,透明度为100,蓝色
- Brush b = new SolidBrush(Color.FromArgb(100, Color.Blue));
- // 字体设置
- FontFamily ff = new FontFamily("华文琥珀");
- Font f = new Font(ff, 50, FontStyle.Bold);
- // 文字区域左上角坐标
- float x = 50;
- float y = 50;
- Graphics g = Graphics.FromImage(img);
- //设置Graphics对象
- g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
- g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
- g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
- // 文字
- g.DrawString("流星剑制作", f, b, new PointF(x, y));
- // 原书示例代码中没有,没有这句则在非IE浏览器会出错
- Response.ContentType = "image/JPEG";
- //将图像加载到Response中
- img.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
- 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;
}