【问题标题】:ASP.NET: Adding 'Watermark' to images on the flyASP.NET:动态向图像添加“水印”
【发布时间】:2011-07-24 09:10:32
【问题描述】:

我看到了关于adding watermark on images with php的精彩问答

我也想这样做,这次使用 ASP.NET

所以这里有几个问题。

  1. 如何使用 ASP 做到这一点?
  2. 此过程是否会对服务器造成很大的过载?
  3. 我可以使用图像而不是简单的文本作为水印吗?

【问题讨论】:

  • My open-source imageresizing.net project 允许您定义多个图像和文本层(或它们的组)以用作水印。完全可配置 XML,请参阅 the documentation page。您可以通过将水印添加到图像 URL 来引用水印,例如 image.jpg?watermark=logo。您可以使用Pipeline.Rewrite 事件处理程序轻松实施水印;您想应用的任何规则都可用。此外,它同时兼容 ASP.NET 和 ASP,因为它有一个 URL API。

标签: asp.net image image-processing watermark


【解决方案1】:

是的,您可以通过在图像上使用GDI+DrawString() 来执行此操作,然后将其保存或作为响应返回。

【讨论】:

    【解决方案2】:

    您需要使用HTTPModule,如ASP.NET Watermarker Module 文章中所述。

    【讨论】:

      【解决方案3】:

      post I made 中,有一个使用 WPF 代替旧的、已弃用的 GDI+ 为图像上的文本添加水印的示例。

      正如你在文章中看到的那样,文本是使用DrawingContext的DrawText方法添加的,用DrawImage代替真的很容易,它接受一个BitmapImage。

      类似的东西:

      BitmapImage logo = new BitmapImage();
      logo.BeginInit();
      logo.CacheOption = BitmapCacheOption.OnLoad;
      logo.UriSource = new Uri(your_physical_logopath);
      logo.EndInit();
      
      Rect rect = new Rect(0, 0, (double)logo.PixelWidth, (double)logo.PixelHeight);
      
      dc.DrawImage(logo, rect);
      

      使用rect.X和rect.Y,在执行DrawImage()之前,可以修改logo图片在DrawingContext中的相对位置。

      【讨论】:

      • 您提供的链接已损坏。
      【解决方案4】:

      这里是另一个来自 codeproject 的示例 http://www.codeproject.com/KB/web-image/ASPImaging1.aspx,您可以对图像做很多思考,包括从图像中添加水印。

      我认为这个过程是在 php 上使用 cpu 电源 ether 在 asp.net 上。所以这类作品需要一个图片缓存模式。

      这是一些基本代码。在此代码中,您必须更改水印的位置和图像的大小。水印可以是透明的png图片。

          public void MakePhoto(...parametres...)
          {
              Bitmap outputImage = null;
              Graphics g = null;
      
              try
              {                
                  // the final image
                  outputImage = new Bitmap(OutWidth, OutHeight, PixelFormat.Format24bppRgb);
      
                  g = Graphics.FromImage(outputImage);
                  g.CompositingMode = CompositingMode.SourceCopy;
                  Rectangle destRect = new Rectangle(0, 0, OutWidth, OutHeight);
      
                  // the photo
                  using (var BasicPhoto = new Bitmap(cBasicPhotoFileOnDisk))
                  {
                      g.DrawImage(BasicPhoto, destRect, 0, 0, BasicPhoto.Width, BasicPhoto.Height, GraphicsUnit.Pixel);
                  }
      
                  g.CompositingMode = CompositingMode.SourceOver;
                  // the watermark
                  using (var WaterMark = new Bitmap(cWaterMarkPhotoOnDisk))
                  {
                      Rectangle destWaterRect = new Rectangle(0, 0, OutWidth, OutHeight);
      
                      g.DrawImage(WaterMark, destWaterRect, 0, 0, OutWidth, OutHeight, GraphicsUnit.Pixel);
                  }
      
                  outputImage.Save(TheFileNameTosaveIt, ImageFormat.Jpeg);
      
              }
              catch (Exception x)
              {
                  Debug.Assert(false);
                  ... log your error, and send an error image....                
              }
              finally
              {
                  if (outputImage != null)
                      outputImage.Dispose();
      
                  if (g != null)
                      g.Dispose();
              }
          }
      

      如果您想制作自定义句柄,上面的代码就可以了,但您只需更改保存行。类似的东西。

      public void ProcessRequest (HttpContext context)    
      {
          context.Response.ContentType = "image/jpeg";
      
          // add you cache here
          context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(200));
          context.Response.Cache.SetMaxAge(new TimeSpan(0, 200, 0));
          context.Response.BufferOutput = false;
      
      
          ..... the above code....
          outputImage.Save(context.Response.OutputStream, ImageFormat.Jpeg);
          ..... the above code....
      
      
          context.Response.End();
      }
      

      【讨论】:

        【解决方案5】:

        旧帖子,但可能有人会寻找用于文本/图像水印的 ASP.Net Core 版本。

        我刚刚为此创建了一个工具,可以从nuget下载:

        PM> Install-Package LazZiya.ImageResize -Version 2.0.0

        添加水印图片如下:

        var img = Image.FromFile("wwwroot\\imags\\my-image.jpg");
        var watermark = Image.FromFile("wwwroot\\images\\watermark.png");
        
        img.ImageWatermark(watermark, 
            TargetSpot.TopRight, //spot to place the watermark
            10,                  //margin from border
            40);                 //opacity of image watermark
        
        img.SaveAs("wwwroot\\images\\new-image.jpg");
        

        该工具还具有更多功能,例如调整大小、裁剪和添加文本水印。

        查看更多示例here

        【讨论】:

          【解决方案6】:

          GroupDocs.Watermark for .NET 是一个功能强大且易于使用的 API,用于向图像文件添加文本和图像水印。这就是你可以用几行代码添加水印的方法:

          using (ImageDocument doc = Document.Load<ImageDocument>("D:\\image.jpeg"))
          {
              // Add text watermark
              TextWatermark watermark = new TextWatermark("Protected Document", new Font("Arial", 8));
              watermark.HorizontalAlignment = HorizontalAlignment.Center;
              watermark.VerticalAlignment = VerticalAlignment.Center;
              doc.AddWatermark(watermark);
          
              // Add image watermark
              ImageWatermark imageWatermark = new ImageWatermark("D:\\watermark.png");
              doc.AddWatermark(imageWatermark);
          
              // Save document
              doc.Save("D:\\output.jpeg");
          }
          

          披露:我在 GroupDocs 担任开发人员宣传员。

          【讨论】:

          • @bummi 你能解释一下为什么答案1)“新访问者可能会从这个答案中得到帮助”。和 2) “我在 GroupDocs 担任开发人员布道师。”不应该被删除?他们没有为答案本身添加任何内容。
          • @bummi 感谢您的解释,请记住这一点。
          猜你喜欢
          • 1970-01-01
          • 2020-12-15
          • 2021-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-15
          相关资源
          最近更新 更多