electron 视频抓图并保存图片到本地

1. 思路:

1.1 通过canvas生成一块画布,在画布上绘制图形
复制代码
     let videoEl = document.getElementById("testVideo");
     let params = {
           videoEl,
           quality:0.95
     }
     let canvasEl = document.createElement('canvas');
     canvasEl.width = videoEl.width;
     canvasEl.height = videoEl.height;   
     let ctx = canvasEl.getContext('2d');
     ctx.drawImage(videoEl, 0, 0, canvasEl.width, canvasEl.height);
     const base64Url = canvasEl.toDataURL('image/jpeg', quality);
     let fileName = 'test.jpg'
1.2 利用node.js 的fs.writeFile方法保存图片到本地
复制代码
fs.writeFile(file,data,callback)
file 文件名或文件描述
data 写入的数据
callback 回调函数
2.代码片段
2.1 js
复制代码
async screenshotFn(){
     let videoEl = document.getElementById("testVideo");
     let params = {
           videoEl,
           quality:0.95
     }
     let canvasEl = document.createElement('canvas');
     canvasEl.width = videoEl.width;
     canvasEl.height = videoEl.height;   
     let ctx = canvasEl.getContext('2d');
     ctx.drawImage(videoEl, 0, 0, canvasEl.width, canvasEl.height);
     const base64Url = canvasEl.toDataURL('image/jpeg', quality);
     let fileName = 'test.jpg'
     //下面是调用node.js 的fs.writeFile方法保存图片到本地
     await window.ipcApis.saveFile({ fileName: fileName, data: base64Url });
 }
2.2 electron/ipcModule/ipcMain.js
复制代码
const { ipcMain, app, clipboard } = require("electron");
const path = require("path")
const fs = require("fs");
const os = require('os');
import logger from "@/utils/log"
import { store } from "@/utils/store";
// 注册主进程通信
function registerIpcMainMsgModule(win) {
    saveFile(),
    setStore(),
    getStore()
}

function saveFile() {
    ipcMain.on("save-file", (event, params) => {
        let { fileName, data } = params;
        const dir = store.get("systemPath");
        const buffer = Buffer.from(data.replace(/^.*base64,/, ""), 'base64');
        fs.writeFile(path.join(dir, fileName), buffer, (err) => {
            logger.error(err);
            if(err){
                event.returnValue = false;
            }
            event.returnValue = true;
        });
    })
}

// 设置store
function setStore() {
    ipcMain.handle("set-store", (event, item) => {
        store.set(item.key, item.val)
    })
}
// 获取store
function getStore() {
    ipcMain.handle("get-store", (event, key) => {
        return store.get(key)
    })
}

export {
    registerIpcMainMsgModule,
}
相关推荐
小雨青年20 分钟前
MateChat 进阶实战:打造零后端、隐私安全的“端侧记忆”智能体
前端·华为·ai·华为云·状态模式
勇气要爆发32 分钟前
问:ES5和ES6的区别
前端·ecmascript·es6
永不停歇的蜗牛1 小时前
Maven的POM文件相关标签作用
服务器·前端·maven
芳草萋萋鹦鹉洲哦1 小时前
【vue/js】文字超长悬停显示的几种方式
前端·javascript·vue.js
HIT_Weston2 小时前
47、【Ubuntu】【Gitlab】拉出内网 Web 服务:Nginx 事件驱动分析(一)
前端·ubuntu·gitlab
国服第二切图仔2 小时前
Electron for 鸿蒙PC项目实战案例之数独游戏
游戏·electron·鸿蒙pc
开发者小天2 小时前
React中的 闭包陷阱
前端·javascript·react.js
翔云 OCR API2 小时前
承兑汇票识别接口技术解析-开发者接口
开发语言·前端·数据库·人工智能·ocr
涔溪2 小时前
Vue3 的核心语法
前端·vue.js·typescript
国服第二切图仔2 小时前
Electron for 鸿蒙pc项目实战之tab标签页组件
javascript·electron·harmonyos·鸿蒙pc