Electron 从入门到实践07之实战 相机应用

Electron 从入门到实践之实战-照相机的开发

1、初始化项目

新建一个目录用于存放第一个e-camera

mkdir e-camera  #注意 windows没有mkdir命令,直接新建文件夹即可

j进入目录后,初始化

npm init   # 这里要根据提示输入相关内容

创建好必要文件

touch index.html
touch main.js
touch event.js  #注意 windows没有touch命令,直接新建文件即可

修改packge.json

{
  "name": "e-camera",
  "productName": "electron相机应用",
  "author": "admin",
  "version": "1.0.0",
  "description": "e-camera",
  "main": "main.js",
  "scripts": {
    "start": "electron ."
  },
  "license": "ISC",
  "devDependencies": {
    "electron": "^5.0.4"
  },
  "dependencies": {
    "electron-packager": "^14.0.0",
    "electron-updater": "^4.0.6",
    "electron": "^5.0.4"
  }
}

安装依赖
由于是在国内,建议使用cnpm

cnpm intall -g

下载好font-awesome的字体css放在 新建的static文件夹里面
安装之后的完整项目结构为:
在这里插入图片描述

2、编写入口文件main.js
const { app, BrowserWindow, Menu, Tray, ipcMain } = require('electron')  // 引入electron

// 保持对window对象的全局引用,如果不这么做的话,当JavaScript对象被
// 垃圾回收的时候,window对象将会自动的关闭
let win

function createWindow () {
  win = new BrowserWindow({
    // 设置窗口大小
    width: 800,
    height: 500,
    webPreferences: {
      nodeIntegration: true
    }
  })
  console.log('system edition:', process.platform)
  // 使用模版创建菜单
  const template = [{
        label: '文件',   // 设置菜单项文本
        submenu: [    // 设置子菜单
          {
              label: '关于',
              role: 'about',       // 设置菜单角色(关于),只针对 Mac  OS X 系统
              click: (menuItem, browserWindow, event)=>{     // 设置单击菜单项的动作(弹出一个新的模态窗口)
                  var aboutWin = new BrowserWindow({width:300,height:200,parent:win,modal: true});
                  aboutWin.loadURL('https://blog.csdn.net/haeasringnar');
                  console.log('role:', menuItem.role)
                }
          },
          {
              type: 'separator'       // 在此处为菜单加分隔栏
          },
          {
              label: '关闭',
              accelerator: 'Ctrl+Q',      // 设置菜单快捷键
              click: ()=>{win.close()}
          }
        ]
    },
    {
      label: '编辑',
      submenu: [
          {
              label: '撤销',
              role:'undo',
              click:()=>{win.webContents.undo()} // 在点击时执行撤销命令
          },
          {
              label: '重做',
              role:'redo',
              click:()=>{win.webContents.redo()} // 在点击时执行重做命令
          },
          {
            type:'separator'   // 设置菜单项分隔条
          },
          {
              label: '剪切',
              role:'cut',
              click:()=>{win.webContents.cut()}
          },
          {
              label: '复制',
              role:'copy',
              click:()=>{win.webContents.copy()} // 在点击时执行复制命令
          },
          {
              label: '粘贴',
              role:'paste',
              click:()=>{win.webContents.paste()} // 在点击时执行粘贴命令
          }
      ]
  }];

  const menu = Menu.buildFromTemplate(template);
  //  开始设置菜单
  Menu.setApplicationMenu(menu);

  // 加载index.html文件
  win.loadFile('index.html')

  // 打开调试工具
  // win.webContents.openDevTools()
  

  // 监听窗口关闭的事件,监听到时将一个消息发送给渲染进程
  win.on('close', (e) => {
    e.preventDefault();
    // 给渲染进程发消息
    win.webContents.send('action', 'exiting');
  });

  // 当 window 被关闭,这个事件会被触发。
  win.on('closed', () => {
    // 取消引用 window 对象,如果你的应用支持多窗口的话,
    // 通常会把多个 window 对象存放在一个数组里面,
    // 与此同时,你应该删除相应的元素。
    win = null
  })
}

// Electron 会在初始化后并准备
// 创建浏览器窗口时,调用这个函数。
// 部分 API 在 ready 事件触发后才能使用。
app.on('ready', createWindow)

// 当全部窗口关闭时退出。
app.on('window-all-closed', () => {
  // 在 macOS 上,除非用户用 Cmd + Q 确定地退出,
  // 否则绝大部分应用及其菜单栏会保持激活。
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', () => {
  // 在macOS上,当单击dock图标并且没有其他窗口打开时,
  // 通常在应用程序中重新创建一个窗口。
  if (win === null) {
    createWindow()
  }
})

// 监听与渲染进程的通讯,监听来自渲染进程的消息,当监听到确定关闭时,将所有窗口退出
ipcMain.on('reqaction', (event, arg) => {
  console.log('zhu jin cheng:', arg)
  switch(arg){
    case 'exit':
      app.exit()  // 退出所有窗口,注意这里使用 app.quit() 无效
      break;
  }
});
3、编写index.html
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>e-camera</title>
    <script src="event.js"></script>
    <link rel="stylesheet" href="static/css/font-awesome.min.css">
    <style type="text/css">
        body {
            margin: 0;
            padding: 0;
            width: 100%;
        }
        .outcontent {
            position: relative;
            overflow: hidden;
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }
        
        .video {
            position: absolute;
            left: 0;
            top: 0;
            margin: 0;
            padding: 0;
        }
        
        #takePhoto {
            position: absolute;
            left: 90%;
            top: 50%;
            margin: 0;
            padding: 0;
        }

        #willshow {
            position: absolute;
            left: 90%;
            top: 80%;
            margin: 0;
            padding: 0;
            /* border: solid 1px black; */
        }

        #showPhoto {
            position: absolute;
            left: 0;
            top: 0;
            display: none;
        }
        
        #takePhoto:hover {
            cursor: pointer;
        }
        #willshow:hover {
            cursor: pointer;
        }
    </style>
</head>

<body onload="onload()">
    <!-- <div id = "panel" style="background-color: brown; width: 300px;height:200px"></div> -->
    <canvas width="640" height="360" style="display: none;"></canvas>
    <!--真正的播放摄像头排到的影像-->
    <div class="outcontent">
        <video autoplay width="100%" height="100%"></video>
        <div id="takePhoto" onclick="takePhoto()">
            <i class="fa fa-camera fa-3x"></i>
        </div>
        <img id="willshow" width="64" height="36" onclick="showPhoto()"/>
        <img id="showPhoto" width="100%" height="100%" onclick="showPhoto()"/>
    </div>
</body>
</html>
4、编写event.js
// 引入对话框
const remote = require('electron').remote;
const ipcRenderer = require('electron').ipcRenderer;
const dialog = remote.dialog;
const Menu = remote.Menu;
const fs = require('fs');

// 用来解释主进程和渲染进程的实例
// 流程:先在主进程中监听窗口的close事件,然后当发生点击时,将消息从主进程发送到渲染进程。渲染进程收到消息后执行某些操作后,将消息发回主进程,由主进程执行剩下的操作
function eventQuit() {
    var options = {};
    options.title = '信息对话框';
    options.message = '确定退出吗?';
    options.type = 'none';
    options.buttons = ['Yes', 'No'];
    dialog.showMessageBox(options, (response) => {
        console.log('当前被单击的按钮索引是' + response);
        if (response == 0) {
            ipcRenderer.send('reqaction', 'exit');
        }
    })
}

//监听与主进程的通信
ipcRenderer.on('action', (event, arg) => {
    switch (arg) {
        case 'exiting':
            eventQuit();
            break;
    }
});

let photoData;
let video;
//弹出对话框保存图像
function savePhoto(filePath) {
    if (filePath) {
        //向文件写入 base 64 格式的图像数据
        fs.writeFile(filePath, photoData, 'base64', (err) => {
            if (err) alert(`保存图像有问题: ${err.message}`);
            photoData = null;
        });
    }
}
//用于初始化视频流
function initialize() {
    document.getElementsByTagName('body')[0].style.height = window.innerHeight+'px';
    video = window.document.querySelector('video');
    window.navigator.mediaDevices.getUserMedia({
        video: { facingMode: "user", width: 640, height: 360 } // 调用前置摄像头并设置尺寸大小 后置摄像头使用video: { facingMode: { exact: "environment" }
    }).then(function(stream) {
        console.log(stream);
        video.srcObject = stream
        video.play();
    }).catch(function(err) {
        console.log(`连接视频流错误: ${err}`);
    })
}
//拍照
function takePhoto() {
    var now_time = new Date().getTime()
    var file_path = String(now_time) + '.jpg'
    let canvas = window.document.querySelector('canvas');
    //将当前的视频图像绘制在 canvas 上 
    canvas.getContext('2d').drawImage(video, 0, 0, 640, 360);
    //获取  base64 格式的图像数据
    photoData = canvas.toDataURL('image/png').replace(/^data:image\/(png|jpg|jpeg);base64,/, '');
    // 将照片以base64的方式生成缩略图
    const willshow = document.getElementById('willshow');
    console.log(willshow.src)
    willshow.src = 'data:image/png;base64,' + photoData
    //显示保存对话框保存图像
    dialog.showSaveDialog({
        title: "保存照片",
        defaultPath: file_path,
        buttonLabel: '保存'
    }, savePhoto);
}


// 查看照片
function showPhoto() {
    const showPhoto = document.getElementById('showPhoto');
    showPhoto.src = 'data:image/png;base64,' + photoData
    if (showPhoto.style.display === "none" || showPhoto.style.display === "") {
        showPhoto.style.display = "block"
    } else {
        showPhoto.style.display = "none"
    }
}

function onload() {
    initialize()
}

window.onresize = function(){
    document.getElementsByTagName('body')[0].style.height = window.innerHeight+'px';
}
5、本地运行
electron .

npm start

如下图表示运行成功在这里插入图片描述

6、打包

查看是否使用electron-packager命令

electron-packager --version

有正常返回表示可以使用该命令
否则,安装electron-packager

cnpm install -g electron-packager

运行打包命令

electron-packager .

运行后会生成一个文件夹,里面会包含一个可执行文件,本例使用的是windows,因此会生成一个.exe的可执行文件
在这里插入图片描述

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
shearphoto2.0 是HTML5头像截图插件,拍照截图,JS截图,美工切图插件,能直接压缩数码相机图片进行截图!是互联网上写得最好的一个同类型插件 ShearPhoto 完美支持Linux Windows 服务器,国外空间等完美通过。 兼容IE6及所有浏览器,兼容PHP5.2X至PHP7.0! ShearPhoto拖动拉伸超准,超流畅,在互联网同类型软件绝对排行第一,除了shearphoto,你别无选择! JAVA用户请到http://git.oschina.net/alexyang/JFinal-shearphoto 下载 ------------------------------------------------------------------------ 从shearphoto 1.5直接跳跃到shearphoto 2.0,这是shearphoto重大革新。本来我是想shearphoto 1.6 、1.7、 1.8 慢慢升的,但是这样升级只会让shearphoto慢慢走向灭亡!结果我又辛苦了一个多星期,把shearphoto 2.0升级完成! shearphoto2.0之前,我认为没必要加入HTML5,兼容IE6 7 8就够。但是直到后来!我知道这是我一个错误的决定 因为用户并没有为shearphoto 1.5埋单,原因shearphoto 1.5没有HTML5截取,用户觉得会增加服务器负载!而且又不是本地加载图片!我一个错误的决定!导致用户份额一直没有明显大增。 shearphoto 2.0是收集所有用户的意见开发而成的! 重大的特性就是全面支持HTML5 1:支持translate3d 硬件加速移动 2:加入图片预览功能 3:加入了压缩数码相机图片, 以及HTML5 canvas本地切图,截图 但依然继续支持IE6 7 8 哦!有人问IE6 7 8不兼容HTML5啊,你骗人吗? 先不要急!shearphoto 2.0的机制是这样的:有HTML5则使用HTML5 canvas切图,截图,JS先会截取一张最合理化的截图,然后交给后端,根据用户设置,进行压缩截图 没有HTML5的浏览器则采用先上传再截取的策略,就是原先1.5的策略。 当然有些用户如果不喜欢HTML5,也可以根据接口自行关闭 4:加HTML5图片特效,就一如美图秀秀这样的特效!shearphoto一共提供14种漂亮特效,感谢腾讯AI对图片特效提供支持 shearphoto 2.0增添很多接口,大部份是HTML5的设置!请下载源码体验 shearphoto外忧内患,已经没退路了。在WEB截图界,shearphoto必须要干个第一!.shearphoto不再局限于头像截取,shearphoto更可用于商城的商品图片编辑。 shearphoto含HTML5图片压缩功能!一张十M 二十M的图,照样能帮你压成你要的容量和尺寸, 一般情况下!商城的商品图片都是通过数码相机拍摄后,要用PHOTOshop把数码相机内几十M的图片,压缩,截取,然后才能上传到商城服务器! 这样的操作是不是太麻烦了! 如果你使用shearphoto你就快捷很多了,shearphoto你只需要直接选择图片,就会帮你进行压缩截取,上传,添加到数据库。这样的一条龙服务! shearphoto 2.0的机制是无可挑剔的!但是不排除有BUG存在,如果用户遇到BUG情况,请到论坛 或官方QQ群进行反馈,我会第一时间发布补丁! shearphoto支持PHP和JAVA,JAVA由网友所写,但是JAVA版并不是太完善,使用的是以前的shearphoto1.3!我 一直很想把NET python nodejs JAVA的很完善地做出来! 可惜个人能力有限,如果你喜欢shearphoto,你又会玩 NET python nodejs JAVA,又想为互联网做贡献,那么你可以加入shearphoto团队,把这些后端版本做出来。但shearphoto没有薪水给你! shearphoto免费开源的,没有利润可图,纯粹是抱着为互联网做贡献的心态!如果你跟我一样,请加入到shearphoto后端开发 浏览器支持: 兼容IE 6 及以上的所有浏览器 后端支持: 支持PHP5.X 至 PHP7.0或以上 支持JAVA后端(shearphoto1.3开发) 系统支持: 支持linux WINDOW服务器 shearphoto采用原生JS + 原生PHP所写,绝对不含JQ插件,对JQ情有独忠的,这个插件不合适你 2015 年 9月 5 日 shearphoto作者:明哥先生 版本
### 回答1: Electron 入门指的是学习如何使用 Electron 框架来开发跨平台的桌面应用程序。首先需要了解 Electron 的基本概念和架构,包括主进程和渲染进程、应用程序的生命周期等。然后需要学习如何使用 HTML、CSS 和 JavaScript 来开发界面和逻辑,并且掌握 Electron 提供的 API 来访问操作系统的底层功能,比如文件系统、网络、窗口管理等。最后需要了解如何打包和发布应用程序,以及如何调试和测试应用程序。 ### 回答2: Electron 是一个用于构建跨平台桌面应用程序的开源框架。它使用 HTML、CSS 和 JavaScript 来创建桌面应用程序,并且可以在不同的操作系统上运行,如 Windows、Mac 接来和 Linux。 学习 Electron 入门可以按照以下步骤进行: 1. 准备开发环境:首先要安装 Node.js 和 npm,它们用于安装 Electron。可以在官方网站上下载并安装最新版本的 Node.js。安装完成后,打开终端或命令提示符窗口,运行命令 `npm install -g electron` 安装 Electron。 2. 创建一个新项目:在合适的目录下创建一个新的文件夹作为项目文件夹。在终端或命令提示符中,切换到项目文件夹,并运行命令 `npm init` 创建一个新的 npm 项目。按照提示一步一步地填写项目信息。完成后,会生成一个 `package.json` 文件,用于管理项目依赖和配置。 3. 安装必要的依赖:现在,需要安装 Electron 的依赖。在终端或命令提示符中运行命令 `npm install electron --save-dev` 安装 Electron。 4. 编写主进程代码:在项目文件夹中创建一个新的 JavaScript 文件,作为 Electron 的主进程代码。主进程代码负责启动应用程序并管理窗口。 5. 编写页面代码:创建一个新的 HTML 文件,用于作为应用程序的主页面。 6. 运行 Electron:在终端或命令提示符中,切换到项目文件夹,并运行命令 `electron .` 启动应用程序。应用程序的窗口将会显示出来,同时运行主进程和页面代码。 通过上述步骤,可以快速入门 Electron,并开始构建跨平台桌面应用程序。可以通过学习 Electron 的文档、示例代码和社区资源深入了解和掌握 Electron 的更多特性和功能。 ### 回答3: electron是一种跨平台的开源桌面应用程序框架,可用于构建基于HTML、CSS和JavaScript的桌面应用程序。它通过将现代Web技术与Node.js的强大功能相结合,提供了一种简单而又强大的方式来开发可在Windows、Mac和Linux上运行的桌面应用程序。 要入门electron,首先需要安装electron的开发环境。可以通过npm(Node.js的包管理器)来安装所需的工具和依赖项。然后,创建一个新的electron项目,并安装electron所需的依赖包。接下来,可以使用任何常见的Web开发工具(如HTML、CSS和JavaScript)来进行应用程序的开发。 在electron中,应用程序的主进程由一个main.js文件来控制,而渲染进程由HTML和JavaScript文件来控制。通过main.js文件,可以创建一个主窗口并控制窗口的行为。在渲染进程中,可以使用Web技术来构建应用程序的用户界面,例如使用HTML构建页面结构,使用CSS样式化页面,使用JavaScript实现交互和动态效果。 electron还提供了许多API和功能,使开发者能够与底层操作系统进行交互,例如访问文件系统、显示原生对话框、打开外部链接等。此外,electron还支持构建可打包为独立安装包的应用程序,以便更方便地在不同操作系统上分发和部署应用程序。 总的来说,入门electron需要安装开发环境,创建项目,使用常见的Web技术进行开发,并利用electron提供的API和功能来构建强大的跨平台桌面应用程序。由于其简单易用的特点,electron已成为许多开发者喜爱的桌面应用程序开发框架之一。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haeasringnar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值