在 C# 中使用 imagemagick.net 在图像上应用水印

Nar*_*esh 0 c# image-processing magick.net

我正在使用以下代码来调整图像大小。现在,我需要使用Magick.NET在此图像上应用水印。

        var response = client.GetObject(request).ResponseStream;
        MagickImage image = new MagickImage(response);
        MagickGeometry size = new MagickGeometry(imgWidth, imgHeight);
        size.IgnoreAspectRatio = maintainAspectRatio;                                                       
        image.Resize(size);   


        Bitmap watermarkObj = (Bitmap)Bitmap.FromFile("G:/Images/watermark.png");
        Graphics imageGraphics = Graphics.FromImage(image.ToBitmap());
        Point point = new Point(image.Width - 118, image.Height - 29);                            
        imageGraphics.DrawImage(watermarkObj, point); 
        image.write("G:/Images/ProcessedImage.JPG");
Run Code Online (Sandbox Code Playgroud)

工作代码:

            MagickGeometry size = new MagickGeometry(imgWidth, imgHeight);
            size.IgnoreAspectRatio = maintainAspectRatio;                                                       
            image.Resize(size);   


            Bitmap watermarkObj = (Bitmap)Bitmap.FromFile("G:/Images/watermark.png");
            Bitmap objImg = new Bitmap("G:/Images/OriginalImage.jpg");
            Graphics imageGraphics = Graphics.FromImage(objImg);
            Point point = new Point(image.Width - 118, image.Height - 29);                            
            imageGraphics.DrawImage(watermarkObj, point); 
            objImg.save("G:/Images/ProcessedImage.JPG");
Run Code Online (Sandbox Code Playgroud)

那么,有人可以帮助我如何使用 imagemagick 来做到这一点吗?原因是当我在图形中传递 imageObject 时,它不会应用水印,而当我传递 .net 图像对象时,它会应用水印。

dle*_*tra 5

您的代码不起作用,因为image.ToBitmap()创建了一个新的位图。当您调用时,image.write("G:/Images/ProcessedImage.JPG");您将保存实例的未修改版本image。您应该执行以下操作。

using (MagickImage image = new MagickImage(response))
{
  MagickGeometry size = new MagickGeometry(imgWidth, imgHeight);
  size.IgnoreAspectRatiomaintainAspectRatio;                                   
  image.Resize(size);

  using (Bitmap watermarkObj = Bitmap)Bitmap.FromFile("G:/Images/watermark.png"))
  {
    using (Bitmap imageObj = image.ToBitmap())
    {
      using (Graphics imageGraphics = Graphics.FromImage(imageObj))
      {
        Point point = new Point(image.Width - 118, image.Height - 29);
        imageGraphics.DrawImage(watermarkObj, point);
        imageObj.Save("G:/Images/ProcessedImage.JPG");
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

另请注意,我添加了这些using语句。当您处理IDisposable类时,您确实应该使用它。

您也可以在不使用 的情况下执行此操作System.Drawing。我为此在 Magick.NET 文档中创建了一个新示例:https://magick.codeplex.com/wikipage? title=Watermark&referringTitle=Documentation

您可以根据您的情况使用以下代码:

using (MagickImage image = new MagickImage(response))
{
  MagickGeometry size = new MagickGeometry(imgWidth, imgHeight);
  size.IgnoreAspectRatiomaintainAspectRatio;                                   
  image.Resize(size);

  using (MagickImage watermark = new MagickImage("G:/Images/watermark.png"))
  {
    image.Composite(watermark, image.Width - 118, image.Height - 29, CompositeOperator.Over);
    image.Write("G:/Images/ProcessedImage.JPG");
  }
}
Run Code Online (Sandbox Code Playgroud)