electron+react截取图片并保存至本地

组件中:

// 截图事件
captureImg = () => {
    if (!this.state.isShowImg) {
      message.info("请先开启图像");
      return;
    }
    message.info("图像截取中,请稍候");
    let imgObject = new Image();
    imgObject.src = this.state.realImg;
    imgObject.setAttribute("crossOrigin", "anonymous");
    let canvas = document.createElement("canvas");
    canvas.width = this.state.cameraData.imageConfig.width;
    canvas.height = this.state.cameraData.imageConfig.height;
    imgObject.onload = () => {
      canvas
        .getContext("2d")
        .drawImage(imgObject, 0, 0, canvas.width, canvas.height);
      let base64Image = canvas.toDataURL("image/jpeg");
      sessionStorage.setItem("base64Image", base64Image);
      this.setState(
        {
          captureImg: base64Image,
          isCaptureImg: true,
        },
        () => {
          message.info("图像截取成功,可进行保存");
        }
      );
    };
    imgObject.onerror = () => {
      message.error("图像截取失败,请重新截取");
    };
  };
// 删除截图
  deleteImg = () => {
    clearInterval(this.saving);
    sessionStorage.removeItem("saveImageSuccess");
    this.setState({
      captureImg: null,
      isCaptureImg: false,
    });
    sessionStorage.removeItem("base64Image");
  };
  // 保存截图判断,具体操作在main.js主进程中
  saveImg = () => {
    if (!sessionStorage.getItem("base64Image")) {
      message.info("暂无可保存截图");
    }
    // 保存截图开启轮询判断是否保存成功
    this.saving = setInterval(() => {
      console.log("轮询图片是否保存成功");
      if (
        sessionStorage.getItem("saveImageSuccess") &&
        sessionStorage.getItem("saveImageSuccess") == "cancel"
      ) {
        console.log("取消保存");
        sessionStorage.removeItem("saveImageSuccess");
        clearInterval(this.saving);
      }
      if (
        sessionStorage.getItem("saveImageSuccess") &&
        sessionStorage.getItem("saveImageSuccess") == "success"
      ) {
        this.deleteImg();
        clearInterval(this.saving);
      }
      if (
        sessionStorage.getItem("saveImageSuccess") &&
        sessionStorage.getItem("saveImageSuccess") == "fail"
      ) {
        message.info("图片保存失败,请重新保存");
        clearInterval(this.saving);
      }
    }, 2000);
  };

// html
...
<img
  style={{
    cursor: this.state.isShowImg
      ? ""
      : this.state.isCaptureImg
      ? ""
      : "not-allowed",
  }}
  src={this.state.isCaptureImg ? icon4 : icon3}
  alt=""
  onClick={() => {
    this.state.isCaptureImg
      ? this.deleteImg()
      : this.captureImg();
  }}
/>
<img
   style={{
     cursor: this.state.isCaptureImg ? "" : "not-allowed",
   }}
   src={icon5}
   alt=""
   id="saveImage"
   onClick={this.saveImg}
 />
...

preload.js(electron预置文件)
由于main.js获取不到缓存,就在preload.js渲染进程中发布,在main.js主进程中接收后再调用fs文件系统进行保存图片至本地

window.ipcRenderer = require('electron').ipcRenderer;
// 保存截图回调监听
window.ipcRenderer.on("saveImageSuccess", (event, data) => {
  console.log("saveImageSuccess",data)
  sessionStorage.setItem("saveImageSuccess",data);
});
// 监听保存图片
window.addEventListener('click', (e) => {
  if(e.srcElement.id == 'saveImage'){
    if(sessionStorage.getItem("base64Image")) window.ipcRenderer.send('saveImage',sessionStorage.getItem("base64Image"));
  }
})

main.js(主进程入口文件)

const {app, BrowserWindow, ipcMain, dialog  } = require('electron');
const fs = require('fs');
// 监听保存图片
  ipcMain.on('saveImage', (event,data)=> {
  // dialog.showSaveDialog为electron功能
    dialog.showSaveDialog({
      title: "保存"
    }).then(result => {
      if(!result.canceled){
        if(data){
          let base64 = data.replace(/^data:image\/\w+;base64,/, "");
          // 利用nodejs的fs文件系统功能进行保存图片,需要先将base64头去掉
          fs.writeFile(result.filePath, Buffer.from(base64, 'base64'),(err) => {
            if(err){
              mainWindow.webContents.send('saveImageSuccess', 'fail');
              console.log("保存相机截图失败",err);
            }else{
              mainWindow.webContents.send('saveImageSuccess', 'success');
              console.log("保存相机截图成功");
            }
          });
        }
      }else {
        mainWindow.webContents.send('saveImageSuccess', 'cancel');
      }
    }).catch(err => {
      console.log(err)
    })
  });

注意:
其中涉及到electron渲染进程与主进程通信问题,可自行百度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值