CEF C++调用前端js方法展示传递过来的图片数据

CEF C++调用前端js方法展示传递过来的图片数据

当我们需要在一个桌面应用程序中展示动态的图片数据时,通常情况下我们可以使用网络图片,但是如果需要展示本地的图片呢?这时候,我们可以使用 CEF (Chromium Embedded Framework) 以及前端的 JavaScript 技术来实现这一需求。

CEF 简介

CEF 是一个基于 Chromium 内核的开源框架,它可以方便地在桌面应用程序中集成 Chrome 浏览器的渲染引擎和 JavaScript 引擎。CEF 提供了 C API、C++ API、Java API 等多种编程接口,可以快速地实现一个完整的 Web 应用程序。CEF 支持 Windows、Linux、Mac 等多个操作系统,并且提供了多进程架构,保证了程序的稳定性和安全性。

前端 JavaScript 函数定义

在前端 JavaScript 中,我们需要定义一个函数来接收 CEF 传递过来的图片数据。这个函数的定义如下:

function showImage(base64str) {
  var img = new Image();
  img.src = base64str;
  document.body.appendChild(img);
}

在这个函数中,我们使用 new Image() 创建 img 元素,并将传递过来的 base64str 赋值给 img.src 属性,然后将 img 元素添加到 body 中,从而实现在网页上展示图片。

CEF C++ 调用前端 JavaScript

在 CEF C++ 中,我们可以使用 ExecuteJavaScript 函数来执行前端的 JavaScript。我们需要将 JavaScript 代码字符串作为参数传递给 ExecuteJavaScript 函数,代码如下:

std::string javascript = "showImage('" + base64str + "')";
browser_->GetMainFrame()->ExecuteJavaScript(javascript, "", 0);

在这个代码中,base64str 表示图片的 Base64 数据。我们将这个数据拼接到 JavaScript 函数调用字符串中,然后传递给 ExecuteJavaScript 函数。该函数将 JavaScript 代码注入到当前网页中,并在网页上展示出传递过来的图片数据,从而完成了在 CEF C++ 中调用前端 JavaScript 方法的操作。

使用范例

下面是一个完整的示例程序,该程序从本地读取图片文件,以 Base64 格式传递给前端 JavaScript,然后在网页上展示图片:

#include <fstream>
#include <iostream>
#include <string>
#include "include/cef_app.h"
#include "include/cef_browser.h"
#include "include/cef_command_line.h"
#include "include/cef_render_process_handler.h"
#include "include/wrapper/cef_helpers.h"

class DemoRenderProcessHandler : public CefRenderProcessHandler {
 public:
  void OnContextCreated(CefRefPtr<CefBrowser> browser,
                        CefRefPtr<CefFrame> frame,
                        CefRefPtr<CefV8Context> context) override {
    CEF_REQUIRE_UI_THREAD();
    // 获取图片文件内容转化为 Base64 格式
    std::string base64str = ImageToBase64("image.jpg");
    // 调用前端 JavaScript 方法传递图片数据
    std::string javascript = "showImage('" + base64str + "')";
    browser->GetMainFrame()->ExecuteJavaScript(javascript, "", 0);
  }

 private:
  std::string ImageToBase64(const std::string& filename) {
    std::ifstream in(filename, std::ios::in | std::ios::binary);
    if (!in) {
      return "";
    }
    std::string base64str;
    while (in) {
      uint8_t buffer[3] = {0};
      in.read(reinterpret_cast<char*>(buffer), sizeof(buffer));
      base64str.append(base64_encode(buffer, sizeof(buffer)));
    }
    in.close();
    return "data:image/jpeg;base64," + base64str;
  }

  std::string base64_encode(const uint8_t* data, size_t len) {
    static const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                                "abcdefghijklmnopqrstuvwxyz"
                                "0123456789+/";
    std::string result;
    result.reserve((len + 2) / 3 * 4);
    for (size_t i = 0; i < len; i += 3) {
      uint32_t buffer = (data[i] << 16) | (i + 1 < len ? data[i + 1] << 8 : 0) |
                        (i + 2 < len ? data[i + 2] : 0);
      result.push_back(table[buffer >> 18]);
      result.push_back(table[(buffer >> 12) & 0x3F]);
      result.push_back(i + 1 < len ? table[(buffer >> 6) & 0x3F] : '=');
      result.push_back(i + 2 < len ? table[buffer & 0x3F] : '=');
    }
    return result;
  }

  IMPLEMENT_REFCOUNTING(DemoRenderProcessHandler);
};

class DemoApp : public CefApp, public CefBrowserProcessHandler {
 public:
  DemoApp() {}

  CefRefPtr<CefRenderProcessHandler> GetRenderProcessHandler() override {
    return new DemoRenderProcessHandler();
  }

  void OnContextInitialized() override {
    CEF_REQUIRE_UI_THREAD();
    CefRefPtr<CefCommandLine> commandLine =
        CefCommandLine::GetGlobalCommandLine();
    CefRefPtr<CefBrowser> browser =
        CefBrowserHost::CreateBrowserSync(CefWindowInfo(), nullptr,
                                          "http://localhost:8080", {}, nullptr,
                                          nullptr);
  }

  IMPLEMENT_REFCOUNTING(DemoApp);
};

int main(int argc, char* argv[]) {
  CefMainArgs main_args(argc, argv);
  CefRefPtr<DemoApp> app(new DemoApp());
  return CefExecuteProcess(main_args, app, nullptr);
}

在该程序中,我们定义了 DemoApp 类和 DemoRenderProcessHandler 类。DemoApp 类是应用程序的入口,继承自 CefApp 类,负责创建和管理浏览器进程;DemoRenderProcessHandler 类继承自 CefRenderProcessHandler 类,负责处理网页渲染进程中的事件。

程序从本地读取图片文件,将图片数据转化为 Base64 格式,并传递给前端 JavaScript,从而完成了在网页上展示图片的操作。

总结

本文介绍了如何使用 CEF C++ 调用前端 JavaScript 方法展示传递过来的图片数据。通过本文的学习,读者可以掌握 CEF C++ 的基础知识,并理解使用 CEF 调用前端技术的方法,为开发更加强大的桌面应用程序提供了有力的支持。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:CEF C++调用前端js方法展示传递过来的图片数据 - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • vnote:一个舒适的markdown笔记软件

    vnote:一个舒适的markdown笔记软件 在写作、笔记、博客排版等场景中,Markdown已越来越受欢迎。但是,纯粹的Markdown编辑器还是过于简单了些,不够智能、方便、美观。这时候,一款好用的Markdown笔记软件就尤为重要。 今天,我要介绍一款非常好用的Markdown笔记软件——vnote。 安装 vnote支持Windows、MacOS和…

    其他 2023年3月28日
    00
  • 使用Spring开启注解AOP的支持放置的位置

    使用Spring开启注解AOP的支持可以使得我们在编写业务代码时更方便地实现面向切面编程。在Spring框架中,我们可以通过在配置文件中添加AOP相关的标签来开启注解AOP的支持。下面我将为你详细讲解开启注解AOP的支持放置的位置的完整攻略。 1.使用标签 在Spring配置文件中添加标签,可以开启Spring的注解支持,这样Spring就会自动扫描我们的注…

    other 2023年6月27日
    00
  • Android DataBinding布局的加载深入探究

    Android DataBinding布局的加载深入探究 什么是DataBinding DataBinding 是在Android数据驱动开发中增强UI绑定的一项新功能,简化了通过代码获取视图变量的步骤,同时实现了单项和双向数据绑定。 DataBinding核心类 ViewDataBinding ViewDataBinding 是DataBinding中的核…

    other 2023年6月25日
    00
  • 【wireshark】插件开发(五):c插件

    wireshark插件开发(五): c插件 在本系列的前几篇文章中,我们讨论了Wireshark插件的开发以及Python和Lua编写插件的方法。在本文中,我们将进一步讨论Wireshark插件开发,并学习如何使用C语言编写Wireshark插件。 C插件 C语言是Wireshark的默认开发语言,并提供了最广泛的插件API。C插件可以访问Wireshark…

    其他 2023年3月29日
    00
  • 一起来看看C语言的预处理注意点

    C语言的预处理器是一种特殊的程序,用于在编译程序之前将源代码进行变换。预处理器会在代码被编译之前对源码文件进行大量处理,例如替换宏定义、条件编译、文件包含等操作。但是,由于预处理器还有一些欠缺之处,因此在学习和使用时需要注意以下几点。 1. 宏定义不要过长 宏定义中的内容应该尽量简单明了,不要太长,否则会让代码读起来难以理解。此外,宏定义中的符号或字符串应该…

    other 2023年6月26日
    00
  • java基础之java的四大特性

    以下是“Java基础之Java的四大特性”的完整攻略: Java的四大特性 Java是一种面向对象的编程语言,具有四大特性,即封装、继承、多态和抽象。这些特性使Java成为一种强大的程语言,可以用于开发各种类型的应用程序。 1. 封装 封装是一种将数据和方法组合在一起的机制,以便将其视为一个单元。Java中,封装可以通过使用访问修饰符来实现。以下是一个封装示…

    other 2023年5月7日
    00
  • mvc:default-servlet-handler的理解

    在Spring MVC中,mvc:default-servlet-handler是一种配置方式,用于将请求转发给Servlet容器的默认Servlet。以下是mvc:default-servlet-handler的完整攻略: 1. 理解mvc:default-servlet-handler 在Spring MVC中,mvc:default-servlet-h…

    other 2023年5月8日
    00
  • 浅入浅出的讲解Spring循环依赖问题

    浅入浅出的讲解Spring循环依赖问题 在Spring应用程序中,依赖注入(Dependency Injection)是一种非常常用的设计模式。通常情况下,我们通过在类的成员变量上使用@Autowired来实现依赖注入。但是,当两个或多个类互相依赖时,就可能发生循环依赖的问题。 什么是循环依赖 循环依赖指的是,当两个或多个类互相依赖时,形成的依赖链呈现出循环…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部