在C#中使用imagemagick.net图像应用水印 [英] Apply watermark on image using imagemagick.net in c#

查看:1921
本文介绍了在C#中使用imagemagick.net图像应用水印的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  VAR响应= client.GetObject(要求).ResponseStream; 
MagickImage形象=新MagickImage(响应);
MagickGeometry大小=新MagickGeometry(imgWidth,imgHeight);
size.IgnoreAspectRatio = maintainAspectRatio;
image.Resize(大小);


位图watermarkObj =(位图)Bitmap.FromFile(G:/Images/watermark.png);
图形imageGraphics = Graphics.FromImage(image.ToBitmap());
点积分=新的点(image.Width - 118,image.Height - 29);
imageGraphics.DrawImage(watermarkObj,点);
image.write(G:/Images/ProcessedImage.JPG);



工作代码:



  MagickGeometry大小=新MagickGeometry(imgWidth,imgHeight); 
size.IgnoreAspectRatio = maintainAspectRatio;
image.Resize(大小);


位图watermarkObj =(位图)Bitmap.FromFile(G:/Images/watermark.png);
位图objImg =新位图(G:/Images/OriginalImage.jpg);
图形imageGraphics = Graphics.FromImage(objImg);
点积分=新的点(image.Width - 118,image.Height - 29);
imageGraphics.DrawImage(watermarkObj,点);
objImg.save(G:/Images/ProcessedImage.JPG);



因此​​,谁能帮助我如何与使用ImageMagick做呢?原因是当我在图形传递imageObject它并不适用在哪里,当我通过.NET图像对象将其应用于水印的水印。


解决方案

您的代码不工作,因为 image.ToBitmap()创建一个新的位图。当你调用 image.write(G:/Images/ProcessedImage.JPG); 要保存的图像的未修改版本实例。你应该做的,而不是下面。



<预类=郎-CS prettyprint-覆盖> 使用(MagickImage形象=新MagickImage(响应))
{
MagickGeometry大小=新MagickGeometry(imgWidth,imgHeight);
size.IgnoreAspectRatiomaintainAspectRatio;
image.Resize(大小); ((位图imageObj = image.ToBitmap))
{使用


使用(位图watermarkObj =位图)Bitmap.FromFile(/Images/watermark.png G) )
{使用
(图形imageGraphics = Graphics.FromImage(imageObj))
{
指向点=新的点(image.Width - 118,image.Height - 29);
imageGraphics.DrawImage(watermarkObj,点);
imageObj.Save(G:/Images/ProcessedImage.JPG);
}
}
}
}



另外请注意,我添加了使用语句。你真的应该用这个当你与的IDisposable 类的工作。



您也可以做到这一点,而无需使用 System.Drawing中。我已经Magick.NET为这个文档中创建了一个新的例子:的https:/ /magick.codeplex.com/wikipage?title=Watermark&ref​​erringTitle=Documentation



您可以在您的情况使用下面的代码:



<预类=郎-CS prettyprint-覆盖> 使用(MagickImage形象=新MagickImage(响应))
{
MagickGeometry大小=新MagickGeometry(imgWidth,imgHeight);
size.IgnoreAspectRatiomaintainAspectRatio;
image.Resize(大小); 118,图像 -
{
image.Composite(水印,image.Width:使用(/Images/watermark.png G)MagickImage水印=新MagickImage()

.Height - 29日,CompositeOperator.Over);
image.Write(G:/Images/ProcessedImage.JPG);
}
}


I am using the following code to resize the image. Now, i need to apply the watermark on this image using 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");

Working Code :

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

So, Can anyone help me how to do it with using imagemagick? Reason being when i pass imageObject in graphics it doesn't apply the watermark where as when i pass the .net image object it apply the watermark.

解决方案

Your code is not working because image.ToBitmap() creates a new Bitmap. When you call image.write("G:/Images/ProcessedImage.JPG"); you are saving an unmodified version of the image instance. You should do the following instead.

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

Also notice that I added the using statements. You should really use this when you are working with IDisposable classes.

You can also do this without using System.Drawing. I have created a new example in the documentation of Magick.NET for this: https://magick.codeplex.com/wikipage?title=Watermark&referringTitle=Documentation

You can use the following code in your situation:

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

这篇关于在C#中使用imagemagick.net图像应用水印的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆