Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动向图像添加水印_C#_Winforms_Algorithm_Image Processing - Fatal编程技术网

C# 自动向图像添加水印

C# 自动向图像添加水印,c#,winforms,algorithm,image-processing,C#,Winforms,Algorithm,Image Processing,在寻找一种在互联网上自动为图像添加水印的解决方案时,我在stackoverflow中找到了一个最好的解决方案。这个问题的链接是。我特别感谢亚历克斯·马斯拉科夫和漂泊者 我通过一些修改实现了这个解决方案,我想把水印放在图像的中心。我修改了漂浮提供的解决方案,如下所示 private void button1_Click(object sender, EventArgs e) { using (Image image = Image.FromFile(@"C:\User

在寻找一种在互联网上自动为图像添加水印的解决方案时,我在stackoverflow中找到了一个最好的解决方案。这个问题的链接是。我特别感谢亚历克斯·马斯拉科夫和漂泊者

我通过一些修改实现了这个解决方案,我想把水印放在图像的中心。我修改了漂浮提供的解决方案,如下所示

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

    }
但水印未正确放置在图像的中心(请参见下图)

请纠正我


谢谢

请尝试此代码进行中心对齐:

int x = (image.Width / 2 - watermarkImage.Width / 2);
int y = (image.Height / 2 - watermarkImage.Height / 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");
    }
}

最后我找到了我问题的答案

下面是正确的代码答案

    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软件 这个链接也帮助我解决了这个问题

谢谢大家

最终结果


工作样本:

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");
用法:

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

在我看来,这真的很重要。为了清晰起见,你能用一个方框替换水印图像吗?我实现了你的解决方案,但结果没有变化,请参见编辑的照片,它是中心对齐的,但从边缘切割,这可能主要是因为画笔尺寸较小。尝试将画笔大小增加到测试。计算结果与原始结果相比没有差异。@FurqanSafdar此处图像大小1024 x 768和水印图像大小213 x 53像素图像的分辨率为72dpi,水印图像的分辨率为96dpi,我找不到上面指定的函数,因此,手动将watermarkimage的分辨率更改为72dpi,但结果没有任何变化我在绘制水纹的方式上稍微改变了您的例程。最后我找到了解决问题的方法,请看我自己的答案。非常感谢您的支持,无法将图像转换为位图