Как создавать водяные знаки и отображать пользовательский HTML-код в .NET

#html #.net #webbrowser-control

#HTML #.net #веб-браузер-управление

Вопрос:

Мне нужно придумать способ ставить водяные знаки на пользовательский HTML-код и отображать его пользователю.

Я поиграл с изменением HTML, установив фоновое изображение, но решение не сработало, если какой-либо html-элемент содержал цвет фона или изображение.

Итак, я подумал, что было бы проще отобразить HTML в элементе управления веб-браузера и поставить водяной знак на элементе управления. Мальчик, я был неправ.

Я попытался создать пользовательский элемент управления и получить его из WebBrowser и перезаписать метод paint. Это не сработало.

Следующей идеей было просто рисовать поверх элемента управления webbrowser.

вот что у меня получилось. В этом примере я поместил в форму ярлык, элемент управления webbrowser и два графических поля. Я создаю изображение и устанавливаю его в оба графических поля. Я поместил одно графическое поле поверх метки, а другое поверх водяного знака.

Поле с картинками над меткой отображалось так, как я ожидал, но поле с картинками над элементом управления webbrowser — нет.

У меня закончились идеи. Есть предложения?

 public partial class Form1 : Form
{
    string WatermarkText = "Confidential";
    Font WatermarkFont = new Font("Microsoft Sans Serif", 24, FontStyle.Bold);
    int WatermarkAngle = 45;
    Color WatermarkColor = Color.PaleTurquoise;

    public Form1()
    {
        InitializeComponent();

        AllowTransparency = true;

        label1.AutoSize = false;
        label1.Text = "Test Text";
        label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;

        webBrowser1.Navigate("http://www.google.com");
        var img = creategraphics(WatermarkText);

        label1.Size = pictureBox2.Size = pictureBox1.Size = img.Size;

        label1.Controls.Add(pictureBox1);
        pictureBox1.Image = img;
        pictureBox1.BackColor = Color.Transparent;
        pictureBox1.Location = new Point(0, 0);

        webBrowser1.Controls.Add(pictureBox2);
        pictureBox2.Image = img;
        pictureBox2.BackColor = Color.Transparent;
        pictureBox2.Location = new Point(0, 0);
    }

    Image creategraphics(string text)
    {
        if (String.IsNullOrWhiteSpace(text)) return null;

        var size = getWatermarkSize(text, WatermarkAngle, WatermarkFont, out double hypotenuse);
        var img = new Bitmap(size.Width, size.Height);
        var g = Graphics.FromImage(img);
        var brush = new SolidBrush(WatermarkColor);
        var stringFormat = new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
        g.RotateTransform((float)-WatermarkAngle);
        g.DrawString(text, WatermarkFont, brush, new Point(0, (int)hypotenuse / 2), stringFormat);
        return img;
    }

    private static Size getWatermarkSize(string text, int angle, Font font, out double hypotenuse)
    {
        if (angle > 90) throw new ArgumentOutOfRangeException("angle");

        using (var bitmap = new Bitmap(1, 1))
        using (var graphics = Graphics.FromImage(bitmap))
        {
            var size = graphics.MeasureString(text, font);
            hypotenuse = size.Width   size.Height;
            double radians = (angle / 180.0) * Math.PI;
            var width = (Math.Cos(radians) * size.Width)   (Math.Sin(radians) * size.Height);
            var height = (Math.Cos(radians) * size.Height)   (Math.Sin(radians) * size.Width);
            return new Size((int)width, (int)height);
        }
    }
}
  

Это то, что я получаю

введите описание изображения здесь