当前位置: 首页 > 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)})})})

效果图:

在这里插入图片描述

相关文章:

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

注:该列出的代码,都在文章内示例出 1. 另存为按钮事件: const saveAsHandler async () > {const { path, sessionId } recordInfoif(typeof message ! string) return;// 因为我的图片是加密的,所以我需要根据接口返回的路…...

Python分析假期对美国出生率的影响

背景 1、数据集下载 birthsHistorical US birth data culled from the CDC website - jakevdp/data-CDCbirthshttps://github.com/jakevdp/data-CDCbirths 2、数据集介绍 此数据来自美国疾病控制和预防中心,并通过 Google 的 BigQuery Web UI 使用以下查询进行编…...

机械臂笛卡尔空间轨迹规划

1. 重新优化末端轨迹规划 调整末端轨迹的插值方法或参数:如果之前使用的是线性插值,可改为三次样条插值。例如,对于一个在二维平面上从点(0, 0)到(10, 10)的末端轨迹,线性插值可能是简单地在每个时间步长均匀增加坐标值&#xff0…...

红队工具---Behinder学习

1.什么是Behinder? Behinder 是一款用于网络渗透测试的安全工具,主要用于对 Web 应用进行攻击和漏洞利用。它提供了强大的功能,是一款红队的大杀器,几乎是现代web安全必须学习的一款webshell管理工具。 主要用途 渗透测试&#…...

k8s 1.28.2 集群部署 NFS server 和 NFS Subdir External Provisioner

文章目录 [toc]前言部署 NFS server镜像准备节点打标签启动 NFS server创建 pv 验证创建 pvc创建 pod 挂载验证 部署 NFS Subdir External Provisioner创建 pod 验证提前创建 pvc 的方式使用 volumeClaimTemplates 的方式 前言 NFS Subdir External Provisioner 可以使用现有的…...

前端零基础入门到上班:【Day1】什么是前端?

本来打算开付费专栏 但是想起那句话 赠人玫瑰手留余香 引言1. 什么是前端?1.1 前端的定义1.2 前端的三大核心技术1.3 前端框架和工具 2. 什么是后端?2.1 后端的定义2.2 后端的组成要素2.3 后端框架和工具 3. 前后端的区别4. 什么是前后端分离&#xff1f…...

搜索二叉树 Binary Search Tree(BST)

【提醒】本章内容需掌握二叉树结构的基本概念和特性,不然可能阅读起来比较费劲。 一、 概念 什么是搜索二叉树?搜索二叉树和普通二叉树的却别是什么? 答: 二叉搜索树又称二叉排序树,它或者是一棵空树 或者是具有以下性…...

数据库表字段插入bug

瀚高数据库 目录 环境 BUG/漏洞编码 症状 触发条件 解决方案 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:4.5.1 BUG/漏洞编码 3355 症状 数据库安全版v4.5.1,安装包为:hgdb4.5.1-see-centos7-x86-64-20210804.…...

信创环境模拟:X86架构下部署搭建aarch64的ARM虚拟机

在真实系统为x86架构下,搭建arm64的虚拟开发环境。在该环境中直接下载打包项目依赖的python运行环境。 前言 随着国家信创环境的要求普及,基本和国家沾边的政企事业单位都换成了信创环境,即ARM64的cpu服务器,而且该类服务器是不…...

TSO的资料

TSO即TCP Segmentation Offload,相关资料如下: Segmentation Offloads in the Linux Networking StackWhat is TCP Segmentation OffloadUnderstanding TCP Segmentation Offload (TSO) and Large Receive Offload (LRO) in a VMware environment...

OpenCV视觉分析之目标跟踪(3)实现基于金字塔的 Lucas-Kanade 算法来进行稀疏光流计算的类SparsePyrLKOpticalFlow的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 用于计算稀疏光流的类。 该类可以使用带有金字塔的迭代 Lucas-Kanade 方法来计算稀疏特征集的光流 cv::SparsePyrLKOpticalFlow 类是 OpenCV 库…...

乐维网管平台(一):如何精准掌控 IP 管理

业网络已成为支撑业务运转的关键基础设施,而在企业网络管理中,IP 管理至关重要,它就像是网络秩序的守护者,确保网络的高效运行、安全可靠。 一、为什么企业要进行 IP 管理 1. 优化资源分配 IP 地址作为网络中的重要资源&#xf…...

React-Route新版本(v6或以上)用法示例

新版本的React-Route (v6或以上,但不排序后续版本还会有修改),移除了Switch,写法和老版本有一些区别,下面分享一个示例: JSX文件: import React, {StrictMode } from react import { createRoot } from react-dom/cli…...

卡方检验方法概述与类型——四格表和R*C表卡方检验案例

卡方检验是以卡方分布为基础,针对定类数据资料的常用假设检验方法。其理论思想是判断实际观测到的频数与有关总体的理论频数是否一致。 卡方统计量是实际频数与理论频数吻合程度的指标。卡方值越小,表明实际观察频数与理论频数越接近,反之卡…...

在浏览器和Node.js环境中使用Puppeteer的Rollup与Webpack打包指南

Puppeteer是一个Node.js库,它提供了一套高级API来通过DevTools协议控制Chrome或Chromium。虽然Puppeteer通常在服务器端使用,但有时你可能需要在浏览器环境中使用它的某些功能。本文将介绍如何使用Rollup和Webpack来打包包含Puppeteer或其轻量级版本Pupp…...

GPT论文整理提示词

论文阅读 指令1:粗读论文 请你阅读并理解这篇文献,然后将该篇文章的标题作为一级标题,将摘要和各个大标题作为二级标题,将小标题作为三级标题,将小标题下每一部分内容作为四级标题,给我以markdown的语言输出中文的翻…...

在培训班学网络安全有用吗

在当今数字化时代,网络安全问题日益凸显,成为了企业和个人关注的焦点。随着对网络安全人才需求的不断增长,各种网络安全培训班也如雨后春笋般涌现。然而,在培训班学网络安全真的有用吗? 一、网络安全的重要性与挑战 1. 信息时代的…...

Flink CDC系列之:理解学习YARN模式

Flink CDC系列之:理解学习YARN模式 准备会话模式在 YARN 上启动 Flink 会话设置 Flink CDC提交 Flink CDC Job Apache Hadoop YARN 是许多数据处理框架中流行的资源提供者。Flink 服务提交给 YARN 的 ResourceManager,后者在由 YARN NodeManagers 管理的…...

langgraph入门

使用langgraph框架搭建一个简易agent。 最近想学习一下agent相关知识,langgraph似乎挺好的,于是就来试一试。langgraph。看了官网,起核心思想是将agent中的角色和工具都当作是图的Node,整个agent流程通过增加Node之间的边来设定。…...

【Python】爬虫程序打包成exe

上一篇写了爬虫获取汽车之家配置表,师父要更方便使用甚至推广(?),反正就是他们没有环境也能用嘛,我就直接打包了,界面不会做也懒得学了、、 1、下载pyinstaller(清华镜像&#xff09…...

【力扣专题栏】两两交换链表中的节点,如何实现链表中两两相邻节点的交换?

这里写目录标题 1、题目描述解释2、算法原理解析3、代码编写 1、题目描述解释 2、算法原理解析 3、代码编写 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int…...

埋点采集的日志数据常见的格式简介

埋点采集的日志数据通常以结构化或半结构化的格式进行记录,以便于分析和处理。常见的格式包括: 1. JSON(JavaScript Object Notation) 特点:JSON 格式是一种轻量级的数据交换格式,具有良好的可读性和兼容…...

基于SSM高考志愿辅助填报系统设计与实现

前言 近年来,由于计算机技术和互联网技术的飞速发展,所以各企事业单位内部的发展趋势是数字化、信息化、无纸化,随着这一趋势,而各种决策系统、辅助系统也就应运而生了,其中,信息管理系统是其中重要的组成…...

elasticsearch 8.x 插件安装(六)之Hanlp插件

elasticsearch 8.x 插件安装(六)之Hanlp插件 elasticsearch插件安装合集 elasticsearch插件安装(一)之ik分词器安装(含MySQL更新) elasticsearch 8.x插件(二)之同义词安装如何解决…...

排序算法简记

列举几种基本的排序算法和排序思想 排序就是将一组对象按照某种逻辑顺序重新排列的过程。 一、选择排序 1、基本原理 最基本的排序,每次都从原有数据中选择最小或最大的数组放入新数据集中 2、步骤(以从小到大为例) 首先, 找到数组中最小的那个元素…...

Stable diffusion inference 多卡并行

stable diffusion 推理过程 多卡并行 注意事项 以SDXL为例,指定GPU,添加device_map参数信息 device_map {add_embedding: 1,decoder: 1,encoder: 1,conv_in: 1,conv_out: 1,post_quant_conv: 1,text_model: 6,conv_norm_out: 1,quant_conv: 1,time_em…...

Docker:namespace环境隔离 CGroup资源控制

Docker:namespace环境隔离 & CGroup资源控制 Docker虚拟机容器 namespace相关命令ddmkfsdfmountunshare 进程隔离文件隔离 CGroup相关命令pidstatstresscgroup控制 内存控制CPU控制 Docker 在开发中,经常会遇到环境问题,比如程序依赖某个…...

鼠标增强工具 MousePlus v5.3.9.0 中文绿色版

MousePlus 是一款功能强大的鼠标增强工具,它可以帮助用户提高鼠标操作效率和精准度。该软件可以自定义鼠标的各种功能和行为,让用户根据自己的习惯和需求来调整鼠标的表现。 详细功能 自定义鼠标按钮功能:可以为鼠标的各个按钮设置不同的功能…...

Android 圆形进度条CircleProgressView 基础版

一个最基础的自定义View 圆形进度条,可设置背景色、进度条颜色(渐变色)下载进度控制;可二次定制度高; 核心代码: Overrideprotected void onDraw(NonNull Canvas canvas) {super.onDraw(canvas);int mW g…...

理解磁盘结构---CHS---LAB---文件系统

1,初步了解磁盘 机械磁盘是计算机中唯的一个机械设备, 特点是慢,容量大,价格便宜。 磁盘上面的光面,由数不清的小磁铁构成,我们知道磁铁是有n/s极的,这刚好与二进制的&…...

建设网站建设安全培训平台/网站建站在线制作

技术高手都有这两个习惯:保持对最新技术趋势的敏感性,并定期更新自己的技能储备。 有没有一种高效的方式来做到呢?我觉得最好的方法,就是直接向 BAT 等一线大厂取经。毕竟,他们在前沿技术领域的持续研究和大规模投入&a…...

福建省人民政府关于印发福建省定价目录的通知/深圳做seo有哪些公司

Go 数字解析 从字符串解析出数字是一个基本的而且很常见的任务。 Go内置的 strconv 提供了数字解析功能。package main import "strconv" import "fmt" func main() { // 使用ParseFloat解析浮点数,64是说明使用多少位 // 精度来解析 f, _ : st…...

企业网站需要在电信做哪些备案/建个网站需要多少钱?

没有所谓最好的教程,每个人的知识背景不一样,定位自然也不一样的。非要推荐一本的话,个人觉得目前市面上“最好”的一本入门教程之一是《Python编程:入门到实践》。说说我的推荐理由: 这本书虽然是国外作者写的&#x…...

惠州网站策划建设/淘宝引流推广平台

主要用到的几个JQUERY函数&#xff1a; li:nth-child(2) 第二张图的意思&#xff1b; attr() 方法设置或返回被选元素的属性值。 setInterval() 方法可按照指定的周期&#xff08;以毫秒计&#xff09;来调用函数或计算表达式。 先看代码 <!DOCTYPE html PUBLIC "-//W…...

重庆建设科技培训中心官方网站/厦门seo公司

gitHub API地址 https://developer.github.com/v3/repos/commits/#parameters 我们打开如下地址 https://developer.github.com/v3/issues/comments/ 可以看到 List comments on an issue点进去可以跳转到 GET /repos/:owner/:repo/issues/:number/comments owner 代表用户…...

网站设计开发软件有哪些/怎么注册域名

QT怎么自动一次性修改、替换程序中所有变量名? 熟悉的编译器都有这个功能&#xff0c; 初学QT&#xff0c;搜索无果&#xff0c;找了一会儿&#xff0c;分析给大家。 最直接的办法&#xff1a;选中变量名&#xff0c;CtrlShiftr &#xff0c;变成红色之后即可更改。. 选中变…...