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

yizhihongxing

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日

相关文章

  • 轻松掌握Linux关机重启命令

    下面是轻松掌握Linux关机重启命令的攻略: 1. 关闭Linux系统 在命令行中使用shutdown命令可以用来关闭Linux系统,命令的格式如下: sudo shutdown [option] time 其中,option指定了shutdown的选项,time指定了关机时间。 1.1. 关机选项 -r,重启系统 -h,关机 -c,取消上一次的shutdo…

    other 2023年6月27日
    00
  • 详谈jvm线程栈空间内存分配位置

    下面就详细讲解一下“详谈jvm线程栈空间内存分配位置”的过程与示例: 背景介绍 在Java程序中,我们知道每个线程都有自己私有的线程栈。线程栈是线程私有的,在JVM内部被实现为一个简单的数组,这个数组的每个元素都是一个栈帧。每个线程只能访问自己的线程栈,不能访问其他线程的线程栈。 线程栈的大小是在JVM启动时由JVM预先设定的,可以通过JVM的启动参数来调整…

    other 2023年6月27日
    00
  • iOS/iPadOS 14.2Beta 1怎么升级?iOS/iPadOS 14.2开发者预览版Beta 1升级方法

    下面是完整的iOS/iPadOS 14.2Beta 1升级攻略。 前置条件 在开始升级之前,请确保你的设备符合以下条件: 你的iPhone或iPad上已经安装了iOS/iPadOS 14.1正式版或更高版本。 你已经注册并且加入了开发者计划。 你的设备已经备份到iCloud或者电脑上,以防止数据丢失。 升级步骤 打开Safari,访问苹果开发者网站(deve…

    other 2023年6月26日
    00
  • 正则表达式匹配闭合HTML标签(支持嵌套)

    正则表达式匹配闭合HTML标签(支持嵌套)攻略 正则表达式是一种强大的工具,可以用来匹配和处理文本。在处理HTML标签时,正则表达式可以帮助我们匹配闭合的标签,包括支持嵌套的情况。下面是一个详细的攻略,包含了两个示例说明。 1. 理解HTML标签的结构 在开始编写正则表达式之前,我们需要先理解HTML标签的结构。HTML标签由尖括号包围,包括开始标签和结束标…

    other 2023年7月28日
    00
  • 怎么清理苹果内存空间 苹果内存清理的详细图文步骤

    怎么清理苹果内存空间:苹果内存清理的详细图文步骤 清理苹果设备的内存空间可以帮助提高设备的性能和响应速度。下面是一份详细的图文步骤,教你如何清理苹果设备的内存空间。 步骤一:关闭不必要的应用程序 关闭不必要的应用程序可以释放设备的内存空间。以下是如何关闭应用程序的示例说明: 在设备的主屏幕上,双击Home按钮(或者在没有Home按钮的设备上,从底部向上滑动并…

    other 2023年7月31日
    00
  • DedeCms自定义字段调用长度截取方法

    以下是“DedeCms自定义字段调用长度截取方法”的完整攻略: 标题 1. 了解DedeCms自定义字段 在DedeCms系统中,我们可以通过自定义字段来为文章添加额外的属性,例如作者、来源、关键字等信息。这些字段可以极大地丰富文章内容,也可以满足实际应用的需求。 2. 自定义字段调用方式 在DedeCms系统中,我们可以使用以下方式来调用自定义字段: {d…

    other 2023年6月25日
    00
  • PHP 5.0创建图形的实用方法完整篇第1/3页

    PHP 5.0创建图形的实用方法完整篇 第1/3页 在PHP 5.0中,有多种方法可以创建和操作图形。以下是详细的攻略: 1. 使用GD库创建图像 GD库是一个常用的PHP图形库,可以用于创建和处理图像。以下是使用GD库创建图像的示例代码: // 创建一个空白图像 $image = imagecreatetruecolor(400, 300); // 设置背…

    other 2023年10月15日
    00
  • dns服务器地址大全 全国主要省份电信/网通/铁通dns地址汇总

    DNS服务器地址大全 全国主要省份电信/网通/铁通DNS地址汇总攻略 介绍 DNS(Domain Name System)是互联网中用于将域名转换为IP地址的系统。在访问网站或发送电子邮件时,计算机需要通过DNS服务器来解析域名。本攻略将提供全国主要省份电信、网通和铁通的DNS服务器地址,以便用户在需要时进行设置。 DNS服务器地址列表 电信DNS服务器地址…

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