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

【electron8】electron实现“图片”的另存为

注:该列出的代码,都在文章内示例出

1. 另存为按钮事件:

const saveAsHandler = async () => {const { path, sessionId } = recordInfoif(typeof message !== 'string') return;// 因为我的图片是加密的,所以我需要根据接口返回的路径,然后根据不同图片的密钥(sessionId)去进行解密(decodeAvatarUrl)处理,最后返回blob,所以这块儿不必纠结const res = await decodeAvatarUrl(path, sessionId, false)// blob转ArrayBufferblobToArrayBuffer(res, async (buffer: ArrayBuffer) => {const type = await getImageType(res) // 将Blob数据传给getImageType,经处理后获取图片类型, 请看标题2的代码示例// saveAsPicture 这个就是渲染进程与Electron的通信 ,请看标题3的代码示例saveAsPicture({ buffer, name: getNowTime(), type }).then(() => setOpen(false))})}

2. getImageType代码:

/*** get image type In image buffer*/
export function getImageType (blob: Blob) {return new Promise((resolve: (type: string) => void, reject) => {const reader = new FileReader();reader.onload = (event: any) => {// 使用Uint8Array和DataView来读取文件头部const arr = new Uint8Array(event.target.result);const view = new DataView(arr.buffer);// 根据文件头部的magic number判断文件类型switch (view.getUint16(0, false)) {case 0xffd8: // JPEGresolve('image/jpeg');break;case 0x8950: // PNGresolve('image/png');break;case 0x4749: // GIFresolve('image/gif');break;case 0x4949: // TIFFcase 0x4d4d: // TIFFresolve('image/tiff');break;default:reject(new Error('Unsupported image type'));}};reader.onerror = reject;// 读取Blob为ArrayBufferreader.readAsArrayBuffer(blob);})
}

3. saveAsPicture的主要代码:

/** 校验:另存为 */
type saveAsPicturePrams = {buffer: ArrayBuffer;name: string;type: string;
} 
/** 另存为 */
export const saveAsPicture = (params: saveAsPicturePrams) => {// 关于与Electron的UI.SAVEASPATH的通信,请看标题4return ipcRenderer.invoke(UI.SAVEASPATH, params)
}

4. Electron进程与渲染进程的交互

/*** 对话窗口:另存为图片时,需要获取选择要存储的路径* @param buffer 数据* @name 文件名* @type 文件类型*/
ipcMain.handle(UI.SAVEASPATH, (e, arg: { buffer: ArrayBuffer, name: string, type: string; }) => {return new Promise(async (resolve, reject) => {const { buffer, name, type } = arg;const imageType = type?.split('/').pop() //获取图片格式const imageName = `xxxxxxx_${name}`const defaultPath = path.join(app.getPath('downloads'),`${imageName}.${imageType}`)await dialog.showSaveDialog(mainWindow, {title: '另存为...',buttonLabel: '保存',defaultPath,properties: ['createDirectory'],filters: [{name: `图片文件(*.${imageType})`,extensions: [imageType]}]}).then((res: any) => {if(res.canceled) {resolve(res)return;};fs.writeFileSync(res.filePath, new DataView(buffer))resolve(res)})})})

效果图:

在这里插入图片描述

http://www.lryc.cn/news/471312.html

相关文章:

  • Python分析假期对美国出生率的影响
  • 机械臂笛卡尔空间轨迹规划
  • 红队工具---Behinder学习
  • k8s 1.28.2 集群部署 NFS server 和 NFS Subdir External Provisioner
  • 前端零基础入门到上班:【Day1】什么是前端?
  • 搜索二叉树 Binary Search Tree(BST)
  • 数据库表字段插入bug
  • 信创环境模拟:X86架构下部署搭建aarch64的ARM虚拟机
  • TSO的资料
  • OpenCV视觉分析之目标跟踪(3)实现基于金字塔的 Lucas-Kanade 算法来进行稀疏光流计算的类SparsePyrLKOpticalFlow的使用
  • 乐维网管平台(一):如何精准掌控 IP 管理
  • React-Route新版本(v6或以上)用法示例
  • 卡方检验方法概述与类型——四格表和R*C表卡方检验案例
  • 在浏览器和Node.js环境中使用Puppeteer的Rollup与Webpack打包指南
  • GPT论文整理提示词
  • 在培训班学网络安全有用吗
  • Flink CDC系列之:理解学习YARN模式
  • langgraph入门
  • 【Python】爬虫程序打包成exe
  • 【力扣专题栏】两两交换链表中的节点,如何实现链表中两两相邻节点的交换?
  • 埋点采集的日志数据常见的格式简介
  • 基于SSM高考志愿辅助填报系统设计与实现
  • elasticsearch 8.x 插件安装(六)之Hanlp插件
  • 排序算法简记
  • Stable diffusion inference 多卡并行
  • Docker:namespace环境隔离 CGroup资源控制
  • 鼠标增强工具 MousePlus v5.3.9.0 中文绿色版
  • Android 圆形进度条CircleProgressView 基础版
  • 理解磁盘结构---CHS---LAB---文件系统
  • 我在1024谈华为