Какие параметры необходимо поменять при инициализации окна WPF, чтобы canvas внутри элемента webrowser отрисовывался с некоторым шумом?

128
18 апреля 2022, 12:00

пробовал добавлять blur в Effect - но это не влияет на значения канвас. значения канвас проверяю на https://browserleaks.com/canvas в какую сторону необходимо копать? необходимо изменять именно средствами c# в окне wpf

дополнение код js, при выполнении которого меняется канвас:

var inj = function(){var data = {
    'r': -3,
    'g': 2,
    'b': 4
}
const toBlob = HTMLCanvasElement.prototype.toBlob;
  const toDataURL = HTMLCanvasElement.prototype.toDataURL;
  HTMLCanvasElement.prototype.htGfd = function() {
    const {width, height} = this;
    const context = this.getContext('2d');
    
    const matt = context.getImageData(0, 0, width, height);
    for (let i = 0; i < height; i += 3) {
      for (let j = 0; j < width; j += 3) {
        const n = ((i * (width * 4)) + (j * 4));
        matt.data[n + 0] = matt.data[n + 0] + data.r;
        matt.data[n + 1] = matt.data[n + 1] + data.g;
        matt.data[n + 2] = matt.data[n + 2] + data.b;
      }
    }
    context.putImageData(matt, 0, 0);
    
  };
  Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
    value: function() {
      
        this.htGfd();
      
      return toBlob.apply(this, arguments);
    }
  });
  Object.defineProperty(HTMLCanvasElement.prototype, 'toDataURL', {
    value: function() {
      
        this.htGfd();
      
      return toDataURL.apply(this, arguments);
    }
  });
  }
inj();
Answer 1

Код на JS слишком сложен, чтобы так в лоб его портировать на C#, но можно пойти по пути динамического выполнения скриптов через window.execScript. Для начала, нужно добиться использования WebBrowser последней версии Internet Explorer, чтобы работал context.getImageData. Для этого необходимо в разделе реестра HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION создать значение DWORD с именем текущего приложения и значением 0x2af9 (см. Internet Feature Controls - Browser Emulation)

Далее, к проекту нужно подключить ссылку на библиотеку MSHTML: Добавить ссылку -> COM -> Microsoft HTML Object Library.

Тогда мы можем с помощью вот такого кода выполнить скрипт на JS для добавления шума в canvas:

using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Runtime.InteropServices;
using mshtml;
namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();            
        }
        string templ = "var drawingCanvas = document.getElementById('{0}');";
        string code = "var context = drawingCanvas.getContext('2d');var data = {'r': -30,'g': 200,'b': 40};var width = drawingCanvas.width;var height = drawingCanvas.height;var matt = context.getImageData(0, 0, width, height);for (var i = 0; i < height; i += 3) {for (var j = 0; j < width; j += 3) {var n = ((i * (width * 4)) + (j * 4));matt.data[n + 0] = matt.data[n + 0] + data.r;matt.data[n + 1] = matt.data[n + 1] + data.g;matt.data[n + 2] = matt.data[n + 2] + data.b;}}context.putImageData(matt, 0, 0);";
        void AddNoise()
        {
            IHTMLDocument3 doc=null;
            IHTMLDocument2 doc2 = null;
            IHTMLWindow2 wnd = null;
            IHTMLElementCollection coll = null;
            try
            {
                doc = webbrowser.Document as IHTMLDocument3;
                doc2 = webbrowser.Document as IHTMLDocument2;
                wnd = doc2.parentWindow;
                coll = doc.getElementsByTagName("canvas");
                foreach (IHTMLElement elem in coll)
                {
                    string script = String.Format(templ, elem.id) + code;
                    wnd.execScript(script);
                    Marshal.ReleaseComObject(elem);
                }
            }
            finally
            {
                if (doc != null) Marshal.ReleaseComObject(doc);
                if (doc2 != null) Marshal.ReleaseComObject(doc2);
                if (wnd != null) Marshal.ReleaseComObject(wnd);
                if (coll != null) Marshal.ReleaseComObject(coll);
            }
        }
    }
}
READ ALSO
Выборка графиков и вывод на экран

Выборка графиков и вывод на экран

Есть таблица с полями: Дата начала приема врача Дата окончания приема врача (В этих полях храниться время на каждый день): Понедельник Вторник...

156
Задать рамки для изменения размера

Задать рамки для изменения размера

У меня скрипт рандомно должен менять модельку, и вот когда я начал писать код Понял что переменная типа floаt может содержать только лишь 1 значание,...

111
Как увеличить переменную long money

Как увеличить переменную long money

У меня есть переменная: public long money; В неё может вместиться максимум 1000000000000000000 или 1Q Мне этого не хватает, можно как-то её увеличить?

143
Как задать счетчик отрисовок?

Как задать счетчик отрисовок?

Всем приветМне нужно реализовать отрисовку квадрата с повторяющимися квадратиками по углам

141