在C#中使用imagemagick.net图像应用水印 [英] Apply watermark on image using imagemagick.net in c#
问题描述
我使用下面的代码来调整图像大小。现在,我需要将此图像使用 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&referringTitle=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屋!