利用 Electron 开发快速截图工具(二)

上一篇我们讲到主界面开发完成,这一篇我们讲子界面的开发。

子界面的生命周期比较短,罗列如下:

窗口打开并显示截图;

用户截图点击确定后,发送截图数据至主进程;

主进程关闭子界面。

我们来看看子界面中的一个个功能是如何实现的。

子界面中元素

canvas 元素

我选用了 canvas 作为截图的容器,主要是考虑到后续用户划取选区时比较方便。

DIV 难以实现遮罩中的选区透明的效果;

DIV 在从右至左,从下至上划取选区时需要不断的计算起始点坐标(左上角为起始点)。

按钮元素

子界面中有三个按钮:

确定按钮:保存截图至剪贴板,并关闭子界面;

保存按钮:保存截图为文件,并关闭子界面;

关闭按钮:关闭子界面。

子界面的打开与关闭

之前我们提到直接在主界面调用 window.close() 关闭窗口,但这会在子界面中引起报错:

Uncaught RangeError: Maximum call stack size exceeded

在 Electron 教程中提到了一点,在网页中调用 GUI API 很危险,应该让主进程执行 GUI 操作。

所以渲染进程(即网页)的关闭应该通过主进程执行。

Electron 提供了我们 ipc 模块实现主进程与渲染进程的通信,需要注意的是,不同的进程中需要引入不同的 ipc 模块。

//in main process

var ipc = require('electron').ipcMain;

//in renderer process

var ipc = require('electron').ipcRenderer;

主界面点击截图按钮时会通知主进程打开子界面:

//in renderer process

document.getElementById('capture').addEventListener('click', function () {

ipc.send('create-sub-window')

})

//in main process

ipc.on('create-sub-window', function (e, wh) {

subWindow = new BrowserWindow({...})

subWindow.loadURL('file://' + __dirname + '/sub.html')

})

当用户点击子界面的关闭按钮时,子界面通过 ipc 模块发送一个“关闭”消息至主进程,通知关闭子界面。

//in renderer process

ipc.send('close-subwindow')

//in main process

ipc.on('close-subwindow', function () {

subWindow.close()

})

用户截图

用户截图部分主要是通过用户在 canvas 上划取选区,最后得到一个参数对象:

{

x: x,

y: y,

width: width,

height: height

}

由于截图部分和 Electron 并不是很搭噶,大家可以从 项目 中查看相关代码。

这个参数可以用于 Electron 进行网页截图。

// electron browserWindow capture page

subWindow.capturePage({

x: x,

y: y,

width: width,

height: height

}, function (image) {

...

})

capturePage 方法接受两个参数,第一个参数是截图的数据参数,包含了截图的起始点与宽高。值得注意的是,高宽必须是正数(canvas 的 rect 方法接受负数的高宽值)。第二个参数就是截图后的回调方法,会参入截得的 nativeImage 对象。如果省略第一个参数,会获得整个网页的截图哦。

网页截图后,需要保存至剪贴板。这时候需要调用 Electron 的剪贴板模块:

var clipboard = require('electron').clipboard

clipboard.writeImage(image) //nativeImage object

向剪贴板中写入图片需要使用 writeImage 方法,并且需要传入从 subWindow.capturePage 方法中得到的 nativeImage 对象。完成后我们可以从 Ctrl + V 的快捷操作中验证。

保存文件

保存文件功能本身是通过 Node.js 的文件系统完成的,但是可以结合 Electron 的对话框,可以使用户自己决定保存目录。

Electron 的 dialog 模块只有 4 个方法可以使用,这里我们使用 showSaveDialog 方法让用户指定目录和文件名。

var dialog = electron.dialog,

fs = require('fs')

dialog.showSaveDialog({title: '请选择保存路径', defaultPath: 'E:/', filters: [

{ name: 'Images', extensions: ['png'] }

]}, function (p) {

fs.writeFile(p, image.toPng(), function () {

...

})

})

由于需要用到截图得到的 nativeImage 对象,需要在主进程中组织代码。Node.js 中的 writeFile 方法支持写入 buffer 数据,所以第二个参数我们使用了 image.toPng 方法,它会返回图片对应格式的 buffer 数据,如果想要 jpg 格式的话可以使用 image.toJpeg 方法。

image.toJpeg(quality)

打包应用

打包在开胃篇中提到过,使用 electron-packager 可以简单方便的实现打包。

npm install electron-packager --save-dev

为了使用方便,我们在 package.json 中加上一个打包命令:

"scripts": {

"start": "electron main.js",

"package": "electron-packager ./ screenCapturer --all --out ~/Desktop/screenCapturer --version 0.37.2 --overwrite --icon=./app/app-icon.ico"

}

以后每次打包,直接跑一下命令即可。

npm run-script package

第一次打包时需要下载相关的资源包,之后就不需要下载了。

项目地址

Thanks

electron 剪贴板 截图_利用 Electron 开发快速截图工具(二)相关推荐

  1. electron 剪贴板 截图_用electron开发了一个屏幕截图工具

    前段时间做了一个钉钉的Linux版本,由于是基于网页版做的,所以缺失了很多桌面应用程序的功能.由于使用的用户多是Linux的用户,所以在Linux的截图功能没有,在几个用户的要求下决定做一个截图功能. ...

  2. python用什么处理文件_利用Python如何快速处理文件

    利用Python如何快速处理文件 我之前要合并将近1000个CSV表格 每个表格共370列,约360行不等,列名相同 三个方案瞬间浮现在我眼前: 1.Ctrl C + Ctrl V--可以睡公司了: ...

  3. 怎么用python编写记事本_利用Python开发实现简单的记事本

    利用Python开发实现简单的记事本 最近想对 python 加深学习一下,同时也是想试着做一些东西,所以使用 python, 结合 Tkinter 来做一个简单的跨平台记事本.最终实现的记事本如下, ...

  4. 如何利用计算机截屏快捷键,电脑截图快捷键,如何利用电脑快捷键快速截图技巧...

    在我们日常使用电脑不管是工作还是娱乐都经常会使用到截图功能,下面我们来介绍使用电脑截图快捷键来实现快速截图的方法.电脑截图快捷键来截图,主要是利用键盘功能实现简单的截图,日常中我们还常常用到各种截图软 ...

  5. pyqt5快速开发与实战_用云开发快速制作客户业务需求收集小程序丨实战

    导语 业务场景下,如何快速优化业务流程.及时落地创意idea?看云开发如何助力业务效率的快速提升! ▌一.导语 如何省去企业上门(现场)搜集客户需求的环节,节约企业人力和时间成本,将客户的业务定制需求 ...

  6. python开发的游戏手机上玩_利用Python开发游戏脚本,就凭一个设定,玩家直接起飞!...

    前言 最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以肝的东西. 当然,作为一名程序员,肝这种东西完全可以用写代码的方式帮我们自动完成.游戏脚本其实并 ...

  7. python手机app开发_利用python开发app实战的方法

    我很早之前就想开发一款app玩玩,无奈对java不够熟悉,之前也没有开发app的经验,因此一直耽搁了.最近想到尝试用python开发一款app,google搜索了一番后,发现确实有路可寻,目前也有了一 ...

  8. openGauss数据库源码解析系列文章——openGauss开发快速入门(二)

    在上一篇openGauss数据库源码解析系列文章--openGauss开发快速入门(上)中,我们介绍了openGauss的安装部署方法,本篇将具体介绍openGauss基本使用. 二. openGau ...

  9. electron 图标制作_使用Electron和Microsoft Bot Framework制作Skype Bot

    electron 图标制作 聊天机器人越来越受欢迎. Facebook正在致力于提供一个构建Messenger机器人的框架,该框架将允许企业所有者完全在Facebook的消息传递应用程序内部建立其客户 ...

  10. vb net excel 剪贴板 粘贴_利用剪贴板强化 Excel 计算

    遇到Excel难以实现的复杂或特殊运算时,可先用剪贴板将数据复制到esProc,利用esProc强大的计算能力完成,再用剪贴板返回Excel.剪贴板方式比传统的add-ins方式部署更简单,操作更顺滑 ...

最新文章

  1. 2022-2028年中国粘网胶行业市场深度评估及发展前景规划报告
  2. 更新到10.11系统之后cocoapods遇到的问题
  3. 阅读架构漫谈(三)笔记
  4. 推荐一款非常好用的java反编译工具(转)
  5. [Java基础]获取Class类的对象
  6. word List 14
  7. C++基础知识点整理
  8. realloc 用方法
  9. 匹配除中文和空格意外的正则写法
  10. 首款搭载鸿蒙OS的智能手机,首款搭载鸿蒙OS 华为智选智能摄像头Pro零点全网开售:299元...
  11. 用R进行文本挖掘与分析:分词、画词云
  12. Spring 单元测试(Junit)
  13. Java程序练习-长整数加法运算
  14. 【win10专业版】3dmax卸载不干净如何解决
  15. 深度学习算法优化系列十 | 二值神经网络(Binary Neural Network,BNN)
  16. (转)如何在Excel2013中制作条形码
  17. 百度云 不限速 | 2019 最好用下载工具
  18. 分享个碧蓝航线脚本,自律捞船神器
  19. ScannerException: while scanning for the next token found character ‘@‘ 问题解决
  20. Emoj cheat sheet

热门文章

  1. html a 标签 邮件超链接 发送邮件
  2. csm和uefi_BIOS里的 CSM 是什么意思,我的只有UEFI
  3. rt-thread驱动篇(02)---STM32F429板卡外设驱动添加
  4. 结构化分析和面向对象分析的区别 例子_淘宝客佣金是什么意思?跟淘宝客服务费有什么区别?-【邯郸seo】...
  5. 老人信息管理系统c语言,基于STM32的老人吃药提醒器——智能电子药盒设计(原理图、PCB源文件、源码、APP源码等)...
  6. 2021 Java面试真题集锦
  7. JAVA最强工具类之一HuTool
  8. 事务回滚 Exception 和 runtimeException , check 检查型异常, uncheck 非检查型异常
  9. 指数函数对数函数导数定义推导
  10. python表示倍数的英语句型_5种倍数表达法句型