当前位置: 首页 > news >正文

使用electron属性实现保存图片并获取图片的磁盘路径

在普通的网页开发中,JavaScript由于安全性的考虑,通常是无法直接获取到客户端的磁盘路径的。浏览器出于隐私和安全原因对此类信息进行了限制。

在浏览器环境下,JavaScript主要通过Web APIs来与浏览器进行交互,而这些API通常受到浏览器的安全策略的限制。文件系统信息是被认为是敏感的信息,因此浏览器不提供直接访问客户端磁盘路径的API。所以要使用electron属性来获取。

第一步:

electron分为主进程和渲染进程,主进程就是使用electron的特性属性api,渲染进程就是我们的代码,比如vue页面代码这种。

首先我们要把项目用electron启动起来,具体怎么启动看我上一篇博客

启动完成后,找到项目文件中的backgroun.js文件,这是electron主进程的文件

把以下代码加进去

import { app, protocol, BrowserWindow ,ipcMain,ipcRenderer,dialog} from 'electron'
const fs = require('fs');
app.on('ready', async () => {// if (isDevelopment && !process.env.IS_TEST) {//   // Install Vue Devtools//   try {//     await installExtension(VUEJS_DEVTOOLS)//   } catch (e) {//     console.error('Vue Devtools failed to install:', e.toString())//   }// }createWindow()// 新增:在主进程中处理打开保存图片对话框的请求ipcMain.handle('dialog:saveImage', async (event, dataURL) => {return saveImage(dataURL);});
})// 将保存图片的逻辑封装成一个函数
async function saveImage(dataURL) {let base64 = dataURL.replace(/^data:image\/\w+;base64,/, '');let dataBuffer = Buffer.from(base64, 'base64');const options = {title: 'Save Image',buttonLabel: '保存', // 自定义保存按钮的文字defaultPath: 'image.jpg', // 默认文件名filters: [{ name: 'Images', extensions: ['jpg', 'png', 'gif'] }]};const { canceled, filePath } = await dialog.showSaveDialog(options);if (canceled) {return null; // 用户取消保存文件时返回 null} else {// 将 dataURL 保存到 filePath 的逻辑代码fs.writeFile(filePath, dataBuffer, function (err) {if (err) {console.error(err, '保存失败');} else {console.log(filePath, '保存成功');}});return filePath; // 返回用户选择的文件路径}
}
  1. 在 Electron 应用程序启动后,创建了窗口(createWindow函数应该是在代码中其他位置定义的)。
  2. 通过 ipcMain.handle 方法,为名为 'dialog:saveImage' 的事件注册了一个处理函数,用于处理保存图片对话框的请求。当渲染进程发送 'dialog:saveImage' 事件时,主进程将会执行 saveImage 函数。
  3. saveImage 函数封装了保存图片的逻辑。首先将 Data URL 转换为 Buffer 格式,然后通过 dialog.showSaveDialog 方法展示保存对话框,用户选择保存路径后,将图片文件保存到指定路径。
  4. saveImage 函数中:

  5. 首先通过 dataURL.replace 和 Buffer.from 将 Data URL 转换成了 Buffer 格式。
  6. 然后使用 dialog.showSaveDialog 方法展示保存对话框,用户选择保存路径后,通过 fs.writeFile 方法将 Buffer 写入文件。
  7. 最后根据保存成功或失败,返回相应的结果给渲染进程。

fs 是 Node.js 核心模块中的一个模块,全称为 File System(文件系统)。这个模块提供了一系列用于处理文件和文件系统的方法,可以用于读取文件、写入文件、创建目录、删除文件等操作。通过 fs 模块,你可以在 Node.js 程序中对文件和文件系统进行各种操作,包括读写文件、文件夹的操作等。

在 Electron 应用程序中,由于可以利用 Node.js 的能力,因此可以在主进程中使用 fs 模块来处理文件和文件系统相关的操作,比如在上面的代码中就使用了 fs.writeFile 方法来将图片保存到指定路径。

这是最终background.js文件的代码:

'use strict'import { app, protocol, BrowserWindow ,ipcMain,ipcRenderer,dialog} from 'electron'
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
// import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
const isDevelopment = process.env.NODE_ENV !== 'production'
const fs = require('fs');// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([{ scheme: 'app', privileges: { secure: true, standard: true } }
])async function createWindow() {// Create the browser window.const win = new BrowserWindow({width: 800,height: 600,webPreferences: {// Use pluginOptions.nodeIntegration, leave this alone// See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more infonodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION}})win.maximize()if (process.env.WEBPACK_DEV_SERVER_URL) {// Load the url of the dev server if in development modeawait win.loadURL(process.env.WEBPACK_DEV_SERVER_URL)if (!process.env.IS_TEST) win.webContents.openDevTools()} else {createProtocol('app')// Load the index.html when not in developmentwin.loadURL('app://./index.html')}
}// Quit when all windows are closed.
app.on('window-all-closed', () => {// On macOS it is common for applications and their menu bar// to stay active until the user quits explicitly with Cmd + Qif (process.platform !== 'darwin') {app.quit()}
})app.on('activate', () => {// On macOS it's common to re-create a window in the app when the// dock icon is clicked and there are no other windows open.if (BrowserWindow.getAllWindows().length === 0) createWindow()
})// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', async () => {// if (isDevelopment && !process.env.IS_TEST) {//   // Install Vue Devtools//   try {//     await installExtension(VUEJS_DEVTOOLS)//   } catch (e) {//     console.error('Vue Devtools failed to install:', e.toString())//   }// }createWindow()// 新增:在主进程中处理打开保存图片对话框的请求ipcMain.handle('dialog:saveImage', async (event, dataURL) => {return saveImage(dataURL);});
})// Exit cleanly on request from parent process in development mode.
if (isDevelopment) {if (process.platform === 'win32') {process.on('message', (data) => {if (data === 'graceful-exit') {app.quit()}})} else {process.on('SIGTERM', () => {app.quit()})}
}// 将保存图片的逻辑封装成一个函数
async function saveImage(dataURL) {let base64 = dataURL.replace(/^data:image\/\w+;base64,/, '');let dataBuffer = Buffer.from(base64, 'base64');const options = {title: 'Save Image',buttonLabel: '保存', // 自定义保存按钮的文字defaultPath: 'image.jpg', // 默认文件名filters: [{ name: 'Images', extensions: ['jpg', 'png', 'gif'] }]};const { canceled, filePath } = await dialog.showSaveDialog(options);if (canceled) {return null; // 用户取消保存文件时返回 null} else {// 将 dataURL 保存到 filePath 的逻辑代码fs.writeFile(filePath, dataBuffer, function (err) {if (err) {console.error(err, '保存失败');} else {console.log(filePath, '保存成功');}});return filePath; // 返回用户选择的文件路径}
}

第二步:

去渲染进程里写相关代码,也就是你的.vue文件

   //保存画布图片saveCanvasBackground() {if (this.image.url == '') return// 获取 canvas 元素和 Fabric 对象const canvas = document.getElementById("label-canvas");const fabricObj = this.fabricObj;// 将 canvas 内容保存为图片数据 URLconst dataURL = canvas.toDataURL({format: "png", // 保存的图片格式quality: 0.8, // 图片质量});//想主进程发送打开保存图片选项框请求ipcRenderer.invoke('dialog:saveImage', dataURL).then(response => {console.log(response, 'sssss');if (response) {// 接口// setsaveImage({//   img:response// }).then(res=>{//   console.log(res,'保存成功接口');// }).catch(err=>{//   console.log(err,'保存失败接口');// })} else {//用户取消}}).catch(err => {console.error(err);});// 创建一个 Blob 对象// const byteCharacters = atob(dataURL.split(",")[1]);// const byteNumbers = new Array(byteCharacters.length);// for (let i = 0; i < byteCharacters.length; i++) {//   byteNumbers[i] = byteCharacters.charCodeAt(i);// }// const byteArray = new Uint8Array(byteNumbers);// const blob = new Blob([byteArray], { type: "image/png" });// // 创建一个下载链接// const url = URL.createObjectURL(blob);// // 创建一个下载按钮并触发点击// const a = document.createElement("a");// a.style.display = "none";// a.href = url;// a.download = "saved_image.png"; // 设置下载的文件名// document.body.appendChild(a);// a.click();// // 释放对象 URL,避免内存泄漏// window.URL.revokeObjectURL(url);},

这段代码是在渲染进程中使用 ipcRenderer.invoke 方法向主进程发送了一个名为 'dialog:saveImage' 的请求,同时传递了一个名为 dataURL 的参数。当主进程处理完这个请求后,渲染进程会接收到相应的结果。

在这段代码中,使用了 ipcRenderer.invoke 方法来发送请求,并通过 Promise 对象处理响应。如果主进程成功处理了请求并返回了结果,会执行 then 中的代码,如果出现错误,会执行 catch 中的代码。

then 中的代码中,首先会打印出返回的 response,然后根据返回的结果进行相应的处理。如果 response 存在,表示图片保存成功,可以处理接口请求或其他逻辑;如果 response 不存在,表示用户取消了保存操作,可以做出相应的反应。

整体来说,这段代码的作用是在渲染进程中向主进程发送保存图片选项框的请求,并根据主进程返回的结果进行相应的处理。

以上红色框内就是运行过后获取出来当前保存图片的磁盘路径!

双击点赞!!!! 

相关文章:

使用electron属性实现保存图片并获取图片的磁盘路径

在普通的网页开发中&#xff0c;JavaScript由于安全性的考虑&#xff0c;通常是无法直接获取到客户端的磁盘路径的。浏览器出于隐私和安全原因对此类信息进行了限制。 在浏览器环境下&#xff0c;JavaScript主要通过Web APIs来与浏览器进行交互&#xff0c;而这些API通常受到浏…...

进击的奶牛

题目 进击的奶牛 题意 通过二分查找算法找到一个最小间距x&#xff0c;使得在数组a中选出的k个数两两之间的间距都不小于x&#xff0c;并且x尽可能大。最后输出这个最大的x值。 思路 程序通过循环依次获取了n个整数&#xff0c;存储在数组a中。.然后&#xff0c;程序对数组a进…...

12月27日,每日信息差

以下是2023年12月27日的8条信息差 第一、小米公司&#xff1a;小米汽车正式加入小米“人车家全生态”&#xff0c;随着小米汽车的即将发布&#xff0c;小米“人车家全生态”也实现了真正闭环 第二、吉利将于2024年初发射11颗卫星&#xff0c;吉利银河E8率先搭载卫星通信技术。…...

【赠书第14期】AI短视频制作一本通:文本生成视频+图片生成视频+视频生成视频

文章目录 前言 1 前期准备 2 拍摄与录制 3 后期编辑 4 技巧与注意事项 5 推荐图书 6 粉丝福利 前言 随着智能技术的迅猛发展&#xff0c;AI 短视频制作成为了一种新兴而创新的表达方式&#xff0c;广泛应用于社交媒体、广告营销、教育培训等领域。本文将介绍 AI 短视频…...

简单工厂设计模式(计算器实例优化)

简单工厂设计模式&#xff08;计算器实例优化&#xff09; 介绍为什么采用面向对象编程而不是面向过程呢&#xff1f;实例讲解业务层划分出来逻辑层继承简单工厂&#xff1a;&#xff08;多态&#xff09;业务层&#xff1a;&#xff08;解耦合&#xff09;主控制台 总结 介绍 …...

iconify图标集离线使用方案简介

1.需求描述 前端项目&#xff0c;技术栈使用Vue3Element Plus&#xff0c;参考了ruoyi-vue-pro项目与vue-element-plus-admin项目&#xff0c;封装了一个Icon组件&#xff0c;图标使用的是iconify,项目部署在内网环境&#xff0c;不能连接互联网&#xff0c;需要部署一套iconi…...

java基础之理解多态

目录 简单理解 满足多态的三个条件 有类继承或者接口实现 子类要重写父类的方法 父类的引用指向子类的对象。 代码示例 动态多态 静态多态 个人观点 简单理解 简单理解就是&#xff0c;同一操作作用于不同的对象&#xff0c;可以有不同的解释&#xff0c;产生不同的执…...

第二证券:A股市场放量反弹 跨年行情或启动

沪指日线等级放量反弹&#xff0c;周四收中阳线成功站上20日均线&#xff0c;底部结构或可树立。创业板指大涨近4%&#xff0c;日线MACD出现底违反&#xff0c;多方动能较强&#xff0c;中等级反弹行情或在酝酿。月线来看&#xff0c;12月创业板指探底上升出现较长下影&#xf…...

web漏洞与修复

一、web漏洞 检测到目标X-Content-Type-Options响应头缺失 详细描述X-Content-Type-Options HTTP 消息头相当于一个提示标志&#xff0c;被服务器用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定&#xff0c;而不能对其进行修改。这就禁用了客户端的 MIM…...

基于Java+SpringBoot+vue实现图书借阅管理系统

基于JavaSpringBootvue实现图书借阅和销售商城一体化系统 &#x1f345; 作者主页 程序设计 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 文章目录 基于JavaSpringBootvue实现图书借阅和销售商城一体化…...

xml文件学习(xml格式)可扩展标记语言(Extensible Markup Language)

XML 教程 文章目录 XML 文件学习1. XML 概述1.1 什么是 XML&#xff1f;1.2 XML 有什么作用&#xff1f; 2. XML 基本结构1. 声明2. 元素3. 属性4. 文本5. 注释 3. XML 高级知识3.1 XML 命名空间3.2 XML 架构3.3 XML 工具3.4 XML 技术 4. XML 应用实例 XML 文件学习 XML&#…...

nodejs+vue+ElementUi家政服务系统c90g5

项目中登录模块用到token家政服务平台有管理员&#xff0c;雇主&#xff0c;雇员三个角色。管理员功能有个人中心&#xff0c;雇主管理&#xff0c;雇员管理&#xff0c;资料认证管理&#xff0c;项目类型管理&#xff0c;服务项目管理&#xff0c;需求信息管理&#xff0c;服务…...

数据库(Database)基础知识

什么是数据库 数据库是按照数据结构来组织、存储和管理数据的仓库&#xff0c;用户可以通过数据库管理系统对存储的数据进行增删改查操作。 数据库实际上是一个文件集合&#xff0c;本质就是一个文件系统&#xff0c;以文件的方式&#xff0c;将数据保存在电脑上。 什么是数据…...

QT应用篇 二、QML用Image组件实现Progress Bar 的效果

QT应用篇 一、QT上位机串口编程 二、QML用Image组件实现Progress Bar 的效果 三、QML自定义显示SpinBox的加减按键图片及显示值效果 文章目录 QT应用篇前言一、qml需求二、使用组件1.Image组件2.Image中fillMode的使用例子 总结 前言 记录自己学习QML的一些小技巧方便日后查找…...

SElinux工作原理简介并演示chcon、semanage、restorecon的使用方法

目录 一.SElinux工作原理简介 1.system_u 2.object_r 3.httpd_sys_content_t 4.s0 二.SElinux策略的具体使用详情 1.restorecon 2.semanage 3.chcon 一.SElinux工作原理简介 通过mac方式管理进程&#xff0c;管理的目标是进程是否具有读取权限的文件&#xff08;文件…...

表情串转换

前言 NWAFU 2021阶段二 D 一、题目描述 题目描述 在一个字符串中&#xff0c;设置了由‘/’前导字符和某些特定字母构成的转义子字符串&#xff0c;如“/s”、“/f”、“/c”等用于表示特殊表情符号。现要求编写一个函数&#xff0c;将给定字符串中的转义字符串转换为表情字…...

【娱乐小技巧】网页旋转90° 3步搞定

一、按F12,打开控制台&#xff1b; 二、点击号&#xff1b; 插入新body; 三、粘贴代码 -webkit-transform: rotate(90deg);小结&#xff0c;角度值可以自选&#xff1b; 代码的效果&#xff1a;...

移动管理系统软件哪家好?它是如何帮助企业降本增效的?

现在很多管理系统都可以用移动设备接入&#xff0c;最常见的就是手机。只要给管理系统创建一个微信小程序接口&#xff0c;那么要使用系统功能的时候直接打开微信小程序就可以了。例如我们小区的物业巡检就是通过微信扫码打开巡检工单记录信息的&#xff0c;直接用巡检保安自己…...

电脑表格文件丢失如何找回?3个方法拯救丢失的文件!

“太难了&#xff01;我辛辛苦苦在电脑上做的表格&#xff0c;不知道什么原因突然就没有了&#xff0c;有什么方法可以找回丢失的表格文件吗&#xff1f;快帮帮我吧&#xff01;” 在日常工作中&#xff0c;很多电脑用户可能都会用到表格文件&#xff0c;这往往记载了大量的重要…...

VSCode 如何安装插件的历史版本

背景 在日常开发过程中&#xff0c;我们可能会遇到新版VSCode插件存在问题&#xff0c;无法正常工作的情况。这种情况下&#xff0c;一种可行的解决方案就是安装插件的历史版本。VSCode 插件默认安装的都是插件最新的版本&#xff0c;例如下面 vscode-styled-compoents 插件 本…...

关于edge浏览器以及插件推荐

目录 广告拦截和隐私工具 密码管理器 生产力和组织工具 写作和语法工具 购物助手 娱乐和个性化 安全性和VPN 开发者工具 其他实用工具 Microsoft Edge 是一款基于Chromium开源项目的现代网络浏览器&#xff0c;由微软开发。它是Internet Explorer的继任者&#xff0c;…...

Vue Tinymce富文本组件自定义操作按钮

想实现如下效果 首先在init方法中的增加一插件 增加一个setup方法 代码 setup: function(editor) { editor.ui.registry.addButton(testButton, {text: 日记日期,tooltip: 插入日记日期,onAction: () > editor.insertContent("123456")});}, 操作效果&#xff0…...

论文阅读:Blind Super-Resolution Kernel Estimation using an Internal-GAN

这是发表在 2019 年 NIPS 上的一篇文章&#xff0c;那个时候还叫 NIPS&#xff0c;现在已经改名为 NeurIPS 了。文章中的其中一个作者 Michal Irani 是以色 Weizmann Institute of Science (魏茨曼科学研究学院) 的一名教授&#xff0c;对图像纹理的内在统计规律有着很深入的研…...

韩国Neowine车规认证加密芯片ALPU-CV

由工采网代理的ALPU-CV是韩国Neowine&#xff08;纽文微&#xff09;推出的一款高性能车规级加密芯片&#xff1b;也是ALPU系列中的高端IC&#xff0c;该芯片通过《AEC-Q100》认证&#xff0c;目前已经在国产前装车辆配件量产使用&#xff0c;主要用于版权license保护、设备防伪…...

【每日一题】收集巧克力

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;枚举操作数 写在最后 Tag 【枚举】【数组】【2023-12-28】 题目来源 2735. 收集巧克力 题目解读 有长度为 n, 下标从 0 开始的整数数组 nums, 表示收集不同类型的巧克力的成本. nums[i] 表示收集类型 i 巧克力的成本…...

【开源】基于Vue+SpringBoot的贫困地区人口信息管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 人口信息管理模块2.2 精准扶贫管理模块2.3 特殊群体管理模块2.4 案件信息管理模块2.5 物资补助模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 人口表3.2.2 扶贫表3.2.3 特殊群体表3.2.4 案件表3.2.5 物资补助表 四…...

八股文打卡day7——计算机网络(7)

面试题&#xff1a;HTTPS和HTTP的区别 我的回答&#xff1a; 1.加密方式&#xff1a;HTTP是明文传输&#xff1b;HTTPS使用了SSL/TLS进行加密传输。 2.安全性&#xff1a;由于HTTP是明文传输的&#xff0c;所以数据内容容易被第三方截获和读取。而HTTPS通过SSL/TLS进行加密传…...

南大通用数据库 GBase 8a 性能调优方法--Hash索引

南大通用数据库--GBase 8a中建立Hash Index 通常可以用来解决等值查询的定位效率&#xff0c;特别是对以单表精确查询为主的应用场景尤为适合&#xff0c;如电信业务中的并发话单查询等&#xff08;特别是内存基本充足的场景&#xff09;。 默认创建GLOBAL的哈希索引。创建全局…...

openFeign调用接口时传递表单参数、Json参数、HttpServletRequest对象

目录 一、控制器二、Feign客户端 openFeign调用接口时传递Json参数以及httpservletrequest对象 一、控制器 RestController RequestMapping("test") public class TestController {/*** 用来测试表单参数传递&#xff1a;单个参数*/PostMapping(value "/formD…...

中国人民银行总行原稽核司副司长王书刚一行莅临国鑫走访交流

12月27日&#xff0c;中国人民银行总行原稽核司副司长王书刚一行莅临Gooxi走访交流&#xff0c;Gooxi相关领导、接待人员陪同调研并汇报了公司有关情况。 中国人民银行总行原稽核司副司长王书刚一行莅临国鑫 在座谈会交流环节&#xff0c;Gooxi接待领导对中国人民银行行长期以来…...

怎样做网站推广啊/网站推广是什么意思

各位好&#xff0c;欢迎。今天你们学习python了吗&#xff1f;今天有给自己打气吗&#xff1f; 今日洗脑金句 &#xff1a; 懒散放纵坑自己&#xff0c;克己自律强无敌&#xff01; 每天起床第一句&#xff0c;告诉自己&#xff0c;我能行&#xff01; 格式化输出的三种方式 追…...

如何建设学校网站/网站seo的内容是什么

统计Xcode项目 代码行数 1、打开终端。 2、cd到你项目的路径。 3、输入下面的指令&#xff1a; grep -d recurse "\n" classes | wc -l classes&#xff0c;如果你不是默认的classes路径&#xff0c;改之。效果:yifei-yumatoMacBook-Pro:QJSG V0.3.1.1 yuyifei2000$ …...

自己做名片的网站/山西seo和网络推广

安装ORCL创建V3XSPACE表空间1)用脚本创建(CREATE SMALLFILE TABLESPACE "V3XSPACE"DATAFILEd:\v3xfile SIZE 100M AUTOEXTEND ON NEXT 2000K MAXSIZE UNLIMITED LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;)2)手工创建创建V3XUSER数据库用户建立…...

做网站公司实习日记/百度首页优化

据华夏时报引述自安居客和经纬的数据指&#xff0c;肇庆的房价已出现较大跌幅&#xff1b;此前另有媒体报道指广州等城市的房价却出现上涨&#xff0c;这显示出不同城市的房价开始出现分化&#xff0c;柏铭科技认为三四五线城市的房地产风险较大。据经纬的数据&#xff0c;肇庆…...

如何在阿里云上做网站备案/2021年网络营销考试题及答案

摘要:本文首先对图像增强的原理进行一定的描述&#xff0c;其次给出了直方图增强、平滑处理、锐化处理、以及彩色增强几种常用的增强方法。并且分别对几种增强方法的原理和处理效果进行了对比研究。同时对这几种增强方法处理方式进行一定的讨论&#xff0c;然后根据在MATLAB中试…...

牙科 网站建设方案/发帖推广平台

背景 记得前段时间&#xff0c;同事说他们测试环境的服务器cpu使用率一直处于100%&#xff0c;本地又没有什么接口调用&#xff0c;为什么会这样&#xff1f;cpu使用率居高不下&#xff0c;自然是有某些线程一直占用着cpu资源&#xff0c;那又如何查看占用cpu较高的线程&#x…...