自动在图像上添加水印
c#
image-processing
7
0

在寻找自动在互联网上为图像添加水印的解决方案时,我在stackoverflow中找到了最佳解决方案。问题的链接是C#-通过特殊方式在照片中添加水印 。特别感谢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");
        }

    }

但是水印未正确放置在图像的中央(请参见下图)。

在此处输入图片说明

请纠正我...

谢谢

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

终于我找到了解决我问题的方法...

更正的代码答案如下

    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的链接使用C#中的TextureBrush在不同高度开始平铺图像的链接问题也帮助我解决了此问题

谢谢大家

最终结果

在此处输入图片说明

收藏
评论

尝试以下代码进行中心对齐:

int x = (image.Width / 2 - watermarkImage.Width / 2);
int y = (image.Height / 2 - watermarkImage.Height / 2);
收藏
评论

原来您的公式很好,

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

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

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

更新:

为了使用SetResolution()从图像更改为位图-看看此更改是否对您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");
    }
}
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号