自动为图像添加水印

Ris*_*han 24 c# algorithm image-processing winforms

在搜索自动将水印添加到互联网图像的解决方案时,我找到了stackoverflow中的最佳解决方案.问题的链接是C# - 通过特殊方式为照片添加水印.我特别感谢 Alex Maslakov漂泊.

我通过一些修改实现了该解决方案,我想将水印放在图像的中心.我修改了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");
        }

    }
Run Code Online (Sandbox Code Playgroud)

但水印未正确放置在图像中心(见下图).

在此输入图像描述

请纠正我......

谢谢

Ris*_*han 20

最后我找到了问题的解决方案......

更正后的代码答案如下

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

    }
Run Code Online (Sandbox Code Playgroud)

感谢Furqan Safdar和Abdias Software 使用C#中的TextureBrush在不同高度开始的平铺图像链接问题也帮助我解决了这个问题

并感谢所有人

终于结果了

在此输入图像描述


小智 7

你原来的配方很好,顺便说一句.

你确定两者的分辨率是一样的吗?将水印图像的DPI分辨率设置为等于图像:

watermarkImage.SetResolution(imageGraphics.DpiX, imageGraphics.DpiY);
Run Code Online (Sandbox Code Playgroud)

(从我的头脑,但我认为属性名称是正确的).

更新:

从图像更改为位图以便使用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");
    }
}
Run Code Online (Sandbox Code Playgroud)