自动为图像添加水印

28

在互联网上搜索如何自动给图片添加水印的解决方案时,我在stackoverflow上找到了最佳方案。问题链接为C# - Add watermark to the photo by special way。特别感谢Alex Maslakovadrift

我对提供的解决方案进行了一些修改,希望将水印放置在图像中心。我按照以下方式修改了adrift提供的解决方案

   private void button1_Click(object sender, EventArgs e)
    {
        using (Image image = Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Desert.jpg"))
        using (Image watermarkImage = Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\watermark.png"))
        using (Graphics imageGraphics = Graphics.FromImage(image))
        using (Brush watermarkBrush = new TextureBrush(watermarkImage))
        {
            int x = (image.Width - watermarkImage.Width)/2;
            int y = (image.Height - watermarkImage.Height)/2;
            imageGraphics.FillRectangle(watermarkBrush, new Rectangle(new Point(x, y), watermarkImage.Size));
            image.Save(@"C:\Users\Public\Pictures\Sample Pictures\Desert_watermark.jpg");
        }

    }

但水印没有正确地放置在图像中心(见下面的图像)。

输入图像描述

请纠正我...

谢谢


对我来说,它看起来是居中的。你能否用一个框替换那个水印图像,以便更清楚地显示它偏离的位置? - Christopher Bales
4个回答

25

终于我找到了解决办法...

修正后的代码如下

    private void button1_Click(object sender, EventArgs e)
    {
        using (Image image = Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Desert.jpg"))
        using (Image watermarkImage = Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\watermark.png"))
        using (Graphics imageGraphics = Graphics.FromImage(image))
        using (TextureBrush watermarkBrush = new TextureBrush(watermarkImage))
        {
            int x = (image.Width / 2 - watermarkImage.Width / 2);
            int y = (image.Height / 2 - watermarkImage.Height / 2);
            watermarkBrush.TranslateTransform(x, y);
            imageGraphics.FillRectangle(watermarkBrush, new Rectangle(new Point(x, y), new Size(watermarkImage.Width+1, watermarkImage.Height)));
            image.Save(@"C:\Users\Public\Pictures\Sample Pictures\Desert_watermark.jpg");
        }

    }

感谢Furqan Safdar和Abdias Software的帮助。链接Problem in tiling image starting at different height using TextureBrush in C#也帮我解决了这个问题。

再次感谢大家。

最终结果:

enter image description here


8

顺便说一下,您的原始公式是没问题的。

您确定两者的分辨率相同吗?将水印图像的DPI分辨率设置为与图像相等:

watermarkImage.SetResolution(imageGraphics.DpiX, imageGraphics.DpiY);

(从我记忆中来看,但我认为属性名称是正确的)。

更新:

更改从图像到位图以使用SetResolution() - 看看这个更改是否适用于您 - 我已更改绘制水印到图像上的方式:

private void button1_Click(object sender, EventArgs e) {

    using (Bitmap image = Bitmap.FromFile("C:\Users\Public\Pictures\Sample Pictures\Desert.jpg"))
    using (Bitmap watermarkImage = Bitmap.FromFile("C:\Users\Public\Pictures\Sample Pictures\watermark.png"))
    using (Graphics imageGraphics = Graphics.FromImage(image))
    {
        watermarkImage.SetResolution(imageGraphics.DpiX, imageGraphics.DpiY);

        int x = ((image.Width - watermarkImage.Width) / 2);
        int y = ((image.Height - watermarkImage.Height) / 2);

        imageGraphics.DrawImage(watermarkImage, x, y, watermarkImage.Width, watermarkImage.Height);

        image.Save("C:\Users\Public\Pictures\Sample Pictures\Desert_watermark.jpg");
    }
}

图片的分辨率为72dpi,水印图片的分辨率为96dpi,我找不到上述指定的函数,因此手动将水印图片的分辨率更改为72dpi,但结果没有变化。 - Riskhan
我稍微修改了你的程序来绘制水印,看看是否有效。 - user1693593
最终我找到了解决问题的方法,请查看我的回答。非常感谢您的支持。 - Riskhan
无法从图像转换为位图。 - Emanuele

2
尝试使用以下代码进行居中对齐:

int x = (image.Width / 2 - watermarkImage.Width / 2);
int y = (image.Height / 2 - watermarkImage.Height / 2);

我实现了你的解决方案,但结果没有改变,请看编辑后的照片。 - Riskhan
顺便提一下,它是居中对齐的,但从边缘削减,这主要是由于笔刷大小较小。尝试增大笔刷大小进行测试。 - Furqan Safdar
与原始结果相比,使用此方法计算的结果没有任何差异。 - user1693593
@FurqanSafdar 这里的图片尺寸为1024 x 768像素,水印图片尺寸为213 x 53像素。 - Riskhan

1
工作示例:
public static Bitmap WatermarkImage(Bitmap image, Bitmap watermark)
{
    using (Graphics imageGraphics = Graphics.FromImage(image))
    {
        watermark.SetResolution(imageGraphics.DpiX, imageGraphics.DpiY);

        int x = (image.Width - watermark.Width) / 2;
        int y = (image.Height - watermark.Height) / 2;

        imageGraphics.DrawImage(watermark, x, y, watermark.Width, watermark.Height);
    }

    return image;
}

使用方法:

Bitmap watermark = new Bitmap(@"c:/watermark.png");
Bitmap bitmap = new Bitmap(@"c:/image.png");
bitmap = WatermarkImage(bitmap, watermark);
bitmap.Save(@"C:/watermarkedImage.png");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接