【问题标题】:Apply watermark on image using imagemagick.net in c#在 c# 中使用 imagemagick.net 在图像上应用水印
【发布时间】:2015-08-01 19:14:12
【问题描述】:

我正在使用以下代码来调整图像大小。现在,我需要使用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");

工作代码:

            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");

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

【问题讨论】:

  • @dlemstra 对此有任何帮助。为什么会这样?

标签: c# image-processing magick.net


【解决方案1】:

您的代码不起作用,因为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");
      }
    }
  }
}

还请注意,我添加了 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");
  }
}

【讨论】:

  • 首先非常感谢您的回答和文档。它真的会帮助那些与之斗争的人。我还想再问一件事,如果我使用以下代码 image = new MagickImage(new Bitmap(image.ToBitmap())); image.Write("G://Images/db.jpg"); 。为什么图像对象的大小在我将其写入磁盘后立即减小。正如我在上面的代码中提到的。为什么在磁盘上写入对象会改变它的大小?
  • 如果我传递 double 类型的 height 和 width 的值,我想 MagickGeometry 类中存在错误。虽然,它会出现任何错误,但最终会调整图像大小。它将是随机大小,而不是您在对象中传递的值。因此,从 double 类型转换为 int 在对象中是不合适的。
  • 你能在这里更详细地报告这个问题吗:magick.codeplex.com/discussions?
  • 我在 Windows 10 中收到“无法加载文件或程序集 'Magick.NET-x64' 或其依赖项之一”的错误,而在 Windows 8 中使用相同的代码。即使我已安装(Visual C++ Redistributable)Magick.NET 是否有任何问题。
  • 嘿,这是现有库中的一个错误http://stackoverflow.com/questions/35270389/gif-images-looses-its-animation-in-magick-net
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
相关资源
最近更新 更多