【问题标题】:Automatically add watermark to an image自动为图像添加水印
【发布时间】:2020-12-15 08:34:01
【问题描述】:

在寻找自动为互联网图像添加水印的解决方案时,我在 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");
        }

    }

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

请纠正我...

谢谢

【问题讨论】:

  • 老实说,它在我看来是居中的。你能用一个方框替换那个水印图像,以便清楚它的位置吗?

标签: c# winforms algorithm image-processing


【解决方案1】:

试试这个代码居中对齐:

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

【讨论】:

  • 我实施了您的解决方案,但结果没有变化,请参阅编辑后的照片
  • 顺便说一下,它是中心对齐的,但从边缘切割,这主要是由于画笔的尺寸可能较小。尝试增加画笔大小以进行测试。
  • 计算结果与原来的没有区别。
  • @FurqanSafdar 这里图片尺寸 1024 x 768 和水印图片尺寸 213 x 53 像素
【解决方案2】:

顺便说一句,你原来的公式很好,

您确定两者的分辨率相同吗?将水印图像的 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,watermarkimage的分辨率是96dpi,找不到上面指定的功能,所以手动把watermarkimage的分辨率改成72dpi,结果没有变化
  • 我已经稍微改变了你画水的方式。看看这是否有效。
  • 我终于找到了解决问题的方法,请看我自己的答案。非常感谢您的支持
  • 无法从图像转换为位图
【解决方案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 链接Problem in tiling image starting at different height using TextureBrush in C#也帮我解决了这个问题

谢谢大家

最终结果

【讨论】:

    【解决方案4】:

    工作示例:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多