当前位置:   article > 正文

C#winform程序与HTML交互传递图像数据demo_winform 嵌入html

winform 嵌入html

实现需求:

C#为后端代码,HTML为前端。

建立C#winform后端程序,内嵌HTML前端网页,后端读入图像,将图像传输到前端HTML显示,前端再返回后端显示成功信号。

实现平台:

Visual Studio 2017

google浏览器内核(注:用Visual Studio自带的WebBrowser也可以实现一样的需求,但是其自带的WebBrowser内核为IE7,兼容性不好,所以本文采用google的内核

1、新建winform工程

2、安装内嵌google浏览器NuGet程序包

点击“项目”—》“管理NuGet程序包(N)”—》“浏览”,输入CefSharp.WinForms进行安装

点击“确定”

安装完成后工程路径下会多一个packages文件夹,对应的google浏览器库就在里面。

3、引用google内核

点击“引用”—》“添加引用”—》“浏览”—》“浏览”。添加我们第二步安装的库文件。

E:\Codes\VisualStudio\CSharp\test\packages\CefSharp.WinForms.85.3.130\CefSharp\x64\CefSharp.WinForms.dll

E:\Codes\VisualStudio\CSharp\test\packages\CefSharp.Common.85.3.130\CefSharp\x64\CefSharp.BrowserSubprocess.Core.dll

E:\Codes\VisualStudio\CSharp\test\packages\CefSharp.Common.85.3.130\CefSharp\x64\CefSharp.Core.dll

E:\Codes\VisualStudio\CSharp\test\packages\CefSharp.Common.85.3.130\CefSharp\x64\CefSharp.dll

4、添加按钮button1和openFileDialog1

 5、在winform中添加代码(Emgucv的配置就不做介绍了)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using CefSharp;
  11. using CefSharp.WinForms;
  12. using Emgu.CV;
  13. using Emgu.CV.Structure;
  14. using Emgu.CV.Util;
  15. using Emgu.CV.CvEnum;
  16. using System.IO;
  17. using System.Drawing.Imaging;
  18. namespace test
  19. {
  20. public partial class Form1 : Form
  21. {
  22. public ChromiumWebBrowser browser;
  23. public Form1()
  24. {
  25. InitializeComponent();
  26. ///设置
  27. InitBrowser();
  28. }
  29. public void InitBrowser()
  30. {
  31. //初始化参数设置
  32. Cef.Initialize(new CefSettings());
  33. //string pathName = "www.baidu.com";
  34. //打开index.html文件,内嵌显示。
  35. string pathName = Application.StartupPath + "\\" + "index.html";
  36. browser = new ChromiumWebBrowser(pathName);
  37. //设置浏览器字体
  38. Font font = new Font("微软雅黑", 10.5f);
  39. browser.Font = font;
  40. //设置浏览器左上角与winform窗体的相对位置
  41. browser.Left = 0;
  42. browser.Top = 0;
  43. //设置浏览器长宽
  44. browser.Width = 800;
  45. browser.Height = 600;
  46. //浏览器停靠方式
  47. browser.Dock = DockStyle.None;
  48. //browser.Dock = DockStyle.Fill;
  49. //添加浏览器
  50. this.Controls.Add(browser);
  51. //绑定JsEvent类为C#与HTML交互的类,交互的名字为myJStest
  52. CefSharpSettings.LegacyJavascriptBindingEnabled = true;
  53. CefSharpSettings.WcfEnabled = true;
  54. browser.JavascriptObjectRepository.Register("myJStest", new JsEvent(), isAsync: true, options: BindingOptions.DefaultBinder);
  55. var isBound = browser.JavascriptObjectRepository.IsBound("myJStest");
  56. //在浏览器中注册myJStest交互类
  57. browser.ExecuteScriptAsyncWhenPageLoaded(@"(async function() {await CefSharp.BindObjectAsync('myJStest', 'myJStest');})();");
  58. }
  59. public static byte[] Bitmap2Byte(Bitmap bitmap)
  60. {
  61. using (Stream stream1 = new MemoryStream())
  62. {
  63. bitmap.Save(stream1, ImageFormat.Jpeg);
  64. byte[] arr = new byte[stream1.Length];
  65. stream1.Position = 0;
  66. stream1.Read(arr, 0, (int)stream1.Length);
  67. stream1.Close();
  68. return arr;
  69. }
  70. }
  71. private async void button1_Click(object sender, EventArgs e)
  72. {
  73. openFileDialog1.Filter = "(*.jpg,*.png,*.jpeg,*.bmp,*.gif)|*.jgp;*.png;*.jpeg;*.bmp;*.gif|All files(*.*)|*.*";
  74. if (openFileDialog1.ShowDialog() == DialogResult.OK)
  75. {
  76. // 调用JavaScript的showImage方法,并传入参数
  77. string fullpath = openFileDialog1.FileName;
  78. string JSfunction = "showImage('";
  79. Mat srcImg = CvInvoke.Imread(fullpath); //读取图片
  80. Image<Bgr, Byte> image = srcImg.ToImage<Bgr, byte>();
  81. Bitmap bImg = image.ToBitmap();
  82. var sendImage = Convert.ToBase64String(Bitmap2Byte(bImg));
  83. JSfunction = JSfunction + "data:image/bmp;base64," + sendImage + "')";
  84. await browser.GetBrowser().MainFrame.EvaluateScriptAsync(JSfunction);//运行页面上js的showImage方法
  85. }
  86. else
  87. {
  88. MessageBox.Show("打开图片失败!!!");
  89. }
  90. }
  91. }
  92. public class JsEvent
  93. {
  94. public void showTest()
  95. {
  96. MessageBox.Show("我是C#中的函数!");
  97. }
  98. public void showTestArg(string ss)
  99. {
  100. MessageBox.Show("我是在C#中收到HTML的返回信号:" + ss);
  101. }
  102. }
  103. }

6、编写一个最简单的index.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>这是个标题</title>
  5. </head>
  6. <body>
  7. <h1>这是一个最简单的HTML</h1>
  8. <p>Hello World!</p>
  9. <script>
  10. function showImage(Imagesrc)
  11. {
  12. var receivedImg=new Image();
  13. receivedImg.src=Imagesrc;
  14. document.body.appendChild(receivedImg);
  15. if (typeof myJStest == "undefined") {
  16. alert("myJStest参数未初始化")
  17. return;
  18. }
  19. myJStest.showTestArg('恭喜恭喜,你的图片在JS中显示成功了!');
  20. }
  21. </script>
  22. </body>
  23. </html>

7、将index.html放到执行程序exe所在的bin路径下,然后运行

8、点击“显示图像”

9、显示成功,且信号返回

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/257803
推荐阅读
相关标签
  

闽ICP备14008679号