MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Какие параметры необходимо поменять при инициализации окна WPF, чтобы canvas внутри элемента webrowser отрисовывался с некоторым шумом?"
Answer 1199842
Код на 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); } } } }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.