2015-07-29 3 views
0

Для изменения размера изображения используется следующий код. Теперь мне нужно применить водяной знак на этом изображении, используя Magick.NET.Применить водяной знак на изображении с помощью imagemagick.net в C#

 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, он применяет водяной знак.

+0

@dlemstra любую помощь по этому вопросу. Почему он ведет себя таким образом? – Naresh

ответ

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

Прежде всего, благодарим вас за ответ и документацию. Это действительно помогло бы людям, которые будут бороться с этим. Я также хочу задать еще одну вещь, если я использую следующий код: image = new MagickImage (новый Bitmap (image.ToBitmap())); image.Write ("G: //Images/db.jpg"); . Почему размер объекта изображения уменьшается, как только я пишу его на диске. Как я уже упоминал в приведенном выше кодексе. Почему запись объекта на диск меняет его размер? – Naresh

+0

Я предполагаю, что в классе MagickGeometry есть ошибка, если я передаю значение высоты и ширины двойного типа. Хотя, он берет его с любой ошибкой, но когда, наконец, он изменяет размер изображения. Это будет случайный размер, а не значение, которое вы передали в объекте. Таким образом, приведение типов из double в int не является правильным в объекте. – Naresh

+0

Можете ли вы сообщить о проблеме более подробно здесь: https://magick.codeplex.com/discussions? – dlemstra