【问题标题】:How to align watermark in an image如何对齐图像中的水印
【发布时间】:2021-10-02 03:43:37
【问题描述】:

我正在尝试将多个水印添加到图像中,中间有一些间隙。不过,我已经能够通过两个小警告来实现这一目标。

我想要的是:

  1. 水印应垂直居中对齐。
  2. 当图像中没有足够的宽度和/或高度时,程序需要停止添加水印(以便没有切割文本)。

我的代码是:

static void WatermarkedImage(string path, string fileName, string message, string destFileName)
        {
            using (Image image = Image.FromFile(path + fileName))
            {
                Graphics graphics = Graphics.FromImage(image);
                Font font = new Font("Arial", 20, FontStyle.Bold);
                SolidBrush brush = new SolidBrush(Color.FromArgb(150, 255, 0, 0));
                
                StringFormat format = new StringFormat();
                format.Alignment = StringAlignment.Center;
                format.FormatFlags = StringFormatFlags.MeasureTrailingSpaces;

                int index = 0;
                float offsetX = image.Width / 3;
                float offsetY = image.Height / 3;
                int increment = Convert.ToInt32(image.Height * 0.15);

                while (offsetY * 1.25 < image.Height)
                {
                    Matrix matrix = new Matrix();
                    matrix.Translate(offsetX, offsetY);
                    matrix.Rotate(-45.0f);

                    graphics.Transform = matrix;
                    graphics.DrawString(message, font, brush, 0, 50, format);

                    offsetX += increment;
                    offsetY += increment;
                    index++;
                }
                image.Save(path + destFileName);
            }
        }

这就是我得到的结果:

所需的输出。

非常感谢任何帮助。 谢谢!

Update-1

【问题讨论】:

  • 我已经删除了你的 ASP.NET 标签,因为这个问题是关于图像处理而不是关于 ASP.NET(网络框架)的。
  • 当您说“应该在末尾对齐”时,您的意思是垂直对齐,对吧?
  • @Cleptus 是的,我的意思是垂直对齐的文本。请在最后查看所需的输出。谢谢。
  • 在您的循环中添加offsetX += increment;。这导致向右移动。尝试评论该行。

标签: c# image image-processing


【解决方案1】:

要检查所有文本是否都在图像内,请使用MeasureString 查看字符串的大小。由此您可以构建一个矩形,使用矩阵变换所述矩形的每个角,并检查它们是否都在图像内。

【讨论】:

    【解决方案2】:

    您想要的输出在 x 轴上没有任何偏移量,因此您根本不应该增加 x 偏移量。

                        offsetY += increment;
                        index++;
                    }
                    while (offsetY * 1.25 < image.Height);
                    image.Save(path + destFileName);
    

    【讨论】:

    • 谢谢@George。这解决了其中一个问题。但是,我仍然遇到第二个问题,即“当图像中没有足够的宽度和/或高度时,程序需要停止添加水印(这样就不会切割文本)。”我添加了更新的输出,请看一下。
    • @Ashar 你试过使用while循环吗?现在您正在使用 do-while,这意味着您首先翻译文本,然后检查它是否在页面之外。
    • 使用 while 循环没有区别(代码已更新)。两种情况下的输出结果都是一样的。
    • 所以文本停止确实有效,问题是条件只检查文本的中间是否在屏幕内。当您旋转文本时,其中一些会退出屏幕。您必须测试偏移量加上一半的文本宽度是否在屏幕之外。类似于while (offsetY * 1.25 + textWidth/2 &lt; image.Height);。就像 JonasH 的回答说的那样,你可以使用 MeasureString 来找到那个 textWidth。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多