65.9K
CodeProject 正在变化。 阅读更多。
Home

图像水印程序

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.94/5 (22投票s)

2010年3月19日

CPOL

3分钟阅读

viewsIcon

68859

downloadIcon

3549

为了唯一地识别我们存储的图像,我们会用一些文本(通常是公司/门户名称)为它们添加水印。

ImageWatermarking

引言

在当今的网站中,我们经常需要保存来自用户的图像,无论是创建个人相册还是产品相册等等。为了唯一地识别我们存储的图像,我们会用一些文本(通常是公司/门户名称)为它们添加水印。本文描述了如何在用户上传图像时或在页面上显示图像之前自动为图像添加水印。

Using the Code

在这个演示程序中,我在根目录下使用了两个文件夹:一个用于保存原始图像,另一个用于保存带水印的图像。一旦用户上传图像,该图像会在添加水印之前保存在原始图像文件夹中,然后再保存在带水印的图像文件夹中。这里应该注意的是,在实际的网站中,我们不保存原始图像,只保存经过处理的图像。因为这个程序是为了演示这个特性,我将两个图像保存在单独的文件夹中,并将它们与页面上的两个不同的图像控件链接。

// Inclusion of these two namespaces is required for such program to work

using System.IO;
using System.Drawing;

第一个用于访问“Path”类,我们通过它提取上传图像的扩展名。接下来需要使用其他图像处理相关的类,如“Bitmap”、“Graphics”、“StringFormat”等。

// The handler function of the button clicking which the image 
// has been processed for watermarking is given below

protected void btnResults_OnClick(object sender, EventArgs e)
{
   if (Page.IsValid && fpImage.HasFile)
   {
      string tmpName = Guid.NewGuid().ToString();
      fpImage.SaveAs(MapPath("~/Original Images/" + tmpName + 
			Path.GetExtension(fpImage.FileName)));
      imgOriginal.ImageUrl = "~/Original Images/" + tmpName + 
			Path.GetExtension(fpImage.FileName);

      Bitmap original_image = new Bitmap(fpImage.FileContent);
      waterMarkImage(original_image, tmpName);
      if(original_image != null) original_image.Dispose();
   }
}

我创建了一个新的 GUID 并将其收集在一个 string 变量 tmpName 中。这是保存原始图像和带水印图像的名称。下一行是将原始图像保存到“Original Images”文件夹。然后将此保存的图像链接到页面上的图像控件。

现在,图像被收集到一个新的 Bitmap 中,并且这个 bitmap 和 tmpName 被传递给一个新的函数,该函数负责为这个图像添加水印。这个函数如下

protected void waterMarkImage(Bitmap imgBmp, string tmpName)
{
  string sWaterMark = "Cherisys Technologies";
  int fontsize = ((imgBmp.Width * 2) / (sWaterMark.Length * 3));
  int x = imgBmp.Width / 2;
  int y = imgBmp.Height * 9 / 10;

  StringFormat drawFormat = new StringFormat();
  drawFormat.Alignment = StringAlignment.Center;
  drawFormat.FormatFlags = StringFormatFlags.NoWrap;

  //drawing string on Image
  Graphics graphic = Graphics.FromImage(imgBmp);
  graphic.DrawString(sWaterMark, new Font("Verdana",fontsize,FontStyle.Bold), 
	new SolidBrush(Color.FromArgb(80, 255, 255, 255)), x, y, drawFormat);

  imgBmp.Save(MapPath("~/Watermarked Images/" + tmpName + 
			Path.GetExtension(fpImage.FileName)));
  imgResult.ImageUrl = "~/WaterMarked Images/" + tmpName + 
			Path.GetExtension(fpImage.FileName);
        
  if (graphic != null) graphic.Dispose();
}

上述函数的前几行用于指定要添加水印的文本、文本的字体大小 (emSize) 以及文本在图像上的位置(文本左上角的 xy 坐标)。您可以根据需要调整所有这些。

现在我创建了一个 StringFormat 类的对象,即“drawFormat”。现在创建了一个 Graphics 类的对象“graphic”,并且我们的原始图像已绘制在上面。这次使用 graphic 对象的 DrawString 函数将水印文本叠加在图像上。

在这里我创建了一个新的 Font,您可以传递字体名称,例如“Verdana”(我的情况),或任何其他字体名称。字体大小是从变量 fontsize 收集的,并且可以将样式指定为 Regular、Bold、Underline、Italic 或 Strikeout。

在这里我创建了一个新的 SolidBrush,并传递了一个使用参数形成的颜色。这是水印文本的颜色,您可以根据需要调整它。简单的技巧是增加第一个参数(即 80)的值以使文本在图像上更不透明,并减小相同的值以使其更透明。

现在我得到了带有水印的图像并将其保存到 Watermarked Images 文件夹。同时,我将这个结果图像分配给页面上的一个 Image 控件。

值得思考的点

实际的东西作为演示附件。当您查看下载文件时,您将很容易理解。图像处理操作需要大量的服务器资源。如果管理不当,它们会降低性能。当您完成时,通过处置诸如 BitmapGraphics 等类的对象来释放资源非常重要。

您可能还对以下我写的文章感兴趣

结束语

我希望您会发现这些内容有帮助。感谢您的阅读。祝你好运!

© . All rights reserved.