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

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

1. 另存为按钮事件:

const saveAsHandler = async () => {
    const { path, sessionId } = recordInfo
    if(typeof message !== 'string') return;
    // 因为我的图片是加密的,所以我需要根据接口返回的路径,然后根据不同图片的密钥(sessionId)去进行解密(decodeAvatarUrl)处理,最后返回blob,所以这块儿不必纠结
    const res = await decodeAvatarUrl(path, sessionId, false)
    // blob转ArrayBuffer
    blobToArrayBuffer(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: // JPEG
          resolve('image/jpeg');
          break;
        case 0x8950: // PNG
          resolve('image/png');
          break;
        case 0x4749: // GIF
          resolve('image/gif');
          break;
        case 0x4949: // TIFF
        case 0x4d4d: // TIFF
          resolve('image/tiff');
          break;
        default:
          reject(new Error('Unsupported image type'));
      }
    };
    reader.onerror = reject;

    // 读取Blob为ArrayBuffer
    reader.readAsArrayBuffer(blob);
  })
}

3. saveAsPicture的主要代码:

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

效果图:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/903105.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全国智能手机使用数据集-dta格式(包含2015、2017、2019三个版本)

数据简介:为推动经济社会高质量发展,缓解经济下行压力,中国加大推动5G基建、大数据中心等科技领域基础设施的建设和完善。数字技术深入各行各业,催生了新业态、新模式、新机会和新就业形式。智能手机作为劳动者使用数字技术的重要…

二叉树的存储方式和遍历方式

文章目录 二叉树的存储方式二叉树的遍历方式DFS--递归遍历DFS--迭代遍历BFS--层次遍历 LC102 二叉树的存储方式 链式存储(指针)或 顺序存储(数组) (1)链式存储:通过指针把分布在各个地址的节点串联一起。 (2)顺序存储…

docker上传离线镜像包到Artifactory

docker上传离线镜像包到Artifactory 原创 大阳 北京晓数神州科技有限公司 2024年10月25日 17:33 北京 随着docker官方源的封禁,最近国内资源也出现无法拉取的问题,Artifactory在生产环境中,很少挂外网代理去官方源拉取,小编提供…

大模型面试-Layer normalization篇

1. Layer Norm 的计算公式写一下? 2. RMS Norm 的计算公式写一下? 3. RMS Norm 相比于 Layer Norm 有什么特点? 4. Deep Norm 思路? 5. 写一下 Deep Norm 代码实现? 6.Deep Norm 有什么优点? 7.LN 在 LLMs …

每日一题之电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits "23" 输出&#…

微信小程序学习实录11:精通表单数据绑定,构建高效用户界面

微信小程序中的表单数据绑定是一种非常实用的功能,它允许开发者将页面上的表单元素与数据进行关联,从而实现数据的双向绑定。这样做的好处是能够简化代码,提高开发效率,并且让数据管理变得更加直观。 一、基本概念 数据绑定&am…

Spring Cloud +UniApp智慧工地源码,智慧工地综合解决方案,建筑工程云平台源码

Spring Cloud UniApp智慧工地源码,智慧工地全套源代码包含:PC端大屏端移动端 智慧工地解决方案以工程建设现场管理需求为主线,以AI、物联网、BIM技术为手段,对施工现场进行立体化、全方位、全时段管理,实现规范施工管…

解决VMware虚拟机的字体过小问题

前言: (1)先装VMware VMware17Pro虚拟机安装教程(超详细)-CSDN博客 (2)通过清华等镜像网站安装好Ubuntu镜像,下面贴上链接 教程虚拟机配置我没有做,因为学校给了现成的虚拟机~~大家需要的自己…

数据结构之单链表——考研笔记

文章目录 一.单链表定义1.什么是单链表2.代码实现3.不带头结点的单链表4.带头结点的单链表 二.单链表插入删除1.按位序插入(带头结点)2.插入时不带头节点3.指定节点的后插操作4.指定节点的前插操作5.按位序删除(带头结点)6.删除指…

2024年【北京市安全员-A证】找解析及北京市安全员-A证考试试卷

题库来源:安全生产模拟考试一点通公众号小程序 北京市安全员-A证找解析考前必练!安全生产模拟考试一点通每个月更新北京市安全员-A证考试试卷题目及答案!多做几遍,其实通过北京市安全员-A证证考试很简单。 1、【多选题】《中华人…

保姆级教程 | 全流程免费:合并多份长宽不同的PDF成相同大小并进行瘦身

背景 由于老板需要,完成不同PDF文件(a,b,c....)合并,同时要求主文件(A)小于6M。合并过程中发现各个PDF大小(长宽)并不相同,造成合并后效果不好也…

网站安全问题都有哪些,分别详细说明

网站安全问题涉及多个方面,以下是一些常见的网站安全问题及其详细说明: 数据泄露 问题描述:数据泄露是指网站存储的用户敏感信息(如用户名、密码、信用卡信息等)被非法获取。黑客可能通过SQL注入、XSS攻击等手段窃取这…

Unity编辑器界面及其基础功能介绍

文章目录 Unity编辑器界面编辑器默认界面布局打开和关闭编辑界面自定义界面布局Unity资源商店Unity Assets Store什么是资源商店?资源商店中包含哪些东西?如何进行素材导入?Unity官网购买素材或插件导入方法非官网素材导入非官网插件导入 Sce…

【WRF数据准备】基于GEE下载静态地理数据-叶面积指数LAI及绿色植被率Fpar

【WRF数据准备】基于GEE下载静态地理数据 准备:WRF所需静态地理数据(Static geographical data)数据范围说明基于GEE下载叶面积指数及绿色植被率GEE数据集介绍数据下载:LAI(叶面积指数)和Fpar(绿色植被率)数据处理:基于Python处理为单波段LAI数据参考GEE的介绍可参见另…

基于Django+python的酒店客房入侵检测系统设计与实现

项目运行 需要先安装Python的相关依赖:pymysql,Django3.2.8,pillow 使用pip install 安装 第一步:创建数据库 第二步:执行SQL语句,.sql文件,运行该文件中的SQL语句 第三步:修改源…

Spring beanFactoryPostProcessor

项目结构和代码 Component public class CustomerBeanFactoryPostProcessor implements BeanFactoryPostProcessor {Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {System.out.printl…

基于Spring Boot的宿舍管理系统设计与实现(源码+定制+开发)宿舍信息管理平台、智能宿舍系统开发、学生宿舍管理平台设计、宿舍入住与信息管理

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

华为:高级ACL 特定ip访问特定ip命令

网络拓扑图: 网络环境: 全网互通即可 1.创建一个名为test的高级ACL acl name test advance 2.添加规则 ##拒绝所有ip访问 rule 10 deny ip source any destination 192.168.1.10 0.0.0.0 只允许特定ip访问特定ip rule 5 permit ip source 192.168.2.10…

C++与现代开发实践第三节:多线程与并发编程

第四章:C与现代开发实践 第三节:多线程与并发编程 在这一课中,我们将详细探讨多线程与并发编程的各个方面,特别是从线程的创建、管理到高级的优化技术,并且通过复杂的实战案例来展示如何应对并发问题。最后&#xff…

并联 高电压、高电流 放大器实现 2 倍输出电流模块±2A

1.1 并联输出电路设计注意事项 直接对两个功率运算放大器的输出进行硬接线并不是一种好的电气做法。如果两个运算放大器的输出直接连接在一起,则可能会导致不均匀的电流共享。这是因为其中的每个运算放大器都尝试强制施加略微不同的 Vout 电压,该电压取决…