electron 剪贴板 截图_利用 Electron 开发快速截图工具(二)
利用 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 开发快速截图工具(二)相关推荐
- electron 剪贴板 截图_用electron开发了一个屏幕截图工具
前段时间做了一个钉钉的Linux版本,由于是基于网页版做的,所以缺失了很多桌面应用程序的功能.由于使用的用户多是Linux的用户,所以在Linux的截图功能没有,在几个用户的要求下决定做一个截图功能. ...
- python用什么处理文件_利用Python如何快速处理文件
利用Python如何快速处理文件 我之前要合并将近1000个CSV表格 每个表格共370列,约360行不等,列名相同 三个方案瞬间浮现在我眼前: 1.Ctrl C + Ctrl V--可以睡公司了: ...
- 怎么用python编写记事本_利用Python开发实现简单的记事本
利用Python开发实现简单的记事本 最近想对 python 加深学习一下,同时也是想试着做一些东西,所以使用 python, 结合 Tkinter 来做一个简单的跨平台记事本.最终实现的记事本如下, ...
- 如何利用计算机截屏快捷键,电脑截图快捷键,如何利用电脑快捷键快速截图技巧...
在我们日常使用电脑不管是工作还是娱乐都经常会使用到截图功能,下面我们来介绍使用电脑截图快捷键来实现快速截图的方法.电脑截图快捷键来截图,主要是利用键盘功能实现简单的截图,日常中我们还常常用到各种截图软 ...
- pyqt5快速开发与实战_用云开发快速制作客户业务需求收集小程序丨实战
导语 业务场景下,如何快速优化业务流程.及时落地创意idea?看云开发如何助力业务效率的快速提升! ▌一.导语 如何省去企业上门(现场)搜集客户需求的环节,节约企业人力和时间成本,将客户的业务定制需求 ...
- python开发的游戏手机上玩_利用Python开发游戏脚本,就凭一个设定,玩家直接起飞!...
前言 最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以肝的东西. 当然,作为一名程序员,肝这种东西完全可以用写代码的方式帮我们自动完成.游戏脚本其实并 ...
- python手机app开发_利用python开发app实战的方法
我很早之前就想开发一款app玩玩,无奈对java不够熟悉,之前也没有开发app的经验,因此一直耽搁了.最近想到尝试用python开发一款app,google搜索了一番后,发现确实有路可寻,目前也有了一 ...
- openGauss数据库源码解析系列文章——openGauss开发快速入门(二)
在上一篇openGauss数据库源码解析系列文章--openGauss开发快速入门(上)中,我们介绍了openGauss的安装部署方法,本篇将具体介绍openGauss基本使用. 二. openGau ...
- electron 图标制作_使用Electron和Microsoft Bot Framework制作Skype Bot
electron 图标制作 聊天机器人越来越受欢迎. Facebook正在致力于提供一个构建Messenger机器人的框架,该框架将允许企业所有者完全在Facebook的消息传递应用程序内部建立其客户 ...
- vb net excel 剪贴板 粘贴_利用剪贴板强化 Excel 计算
遇到Excel难以实现的复杂或特殊运算时,可先用剪贴板将数据复制到esProc,利用esProc强大的计算能力完成,再用剪贴板返回Excel.剪贴板方式比传统的add-ins方式部署更简单,操作更顺滑 ...
最新文章
- 2022-2028年中国粘网胶行业市场深度评估及发展前景规划报告
- 更新到10.11系统之后cocoapods遇到的问题
- 阅读架构漫谈(三)笔记
- 推荐一款非常好用的java反编译工具(转)
- [Java基础]获取Class类的对象
- word List 14
- C++基础知识点整理
- realloc 用方法
- 匹配除中文和空格意外的正则写法
- 首款搭载鸿蒙OS的智能手机,首款搭载鸿蒙OS 华为智选智能摄像头Pro零点全网开售:299元...
- 用R进行文本挖掘与分析:分词、画词云
- Spring 单元测试(Junit)
- Java程序练习-长整数加法运算
- 【win10专业版】3dmax卸载不干净如何解决
- 深度学习算法优化系列十 | 二值神经网络(Binary Neural Network,BNN)
- (转)如何在Excel2013中制作条形码
- 百度云 不限速 | 2019 最好用下载工具
- 分享个碧蓝航线脚本,自律捞船神器
- ScannerException: while scanning for the next token found character ‘@‘ 问题解决
- Emoj cheat sheet
热门文章
- html a 标签 邮件超链接 发送邮件
- csm和uefi_BIOS里的 CSM 是什么意思,我的只有UEFI
- rt-thread驱动篇(02)---STM32F429板卡外设驱动添加
- 结构化分析和面向对象分析的区别 例子_淘宝客佣金是什么意思?跟淘宝客服务费有什么区别?-【邯郸seo】...
- 老人信息管理系统c语言,基于STM32的老人吃药提醒器——智能电子药盒设计(原理图、PCB源文件、源码、APP源码等)...
- 2021 Java面试真题集锦
- JAVA最强工具类之一HuTool
- 事务回滚 Exception 和 runtimeException , check 检查型异常, uncheck 非检查型异常
- 指数函数对数函数导数定义推导
- python表示倍数的英语句型_5种倍数表达法句型