Electron:点击右键保存图片到本地

news2025/3/10 7:44:38

前期插件

前端请求后台的一种方法

npm install got -S

用于获取ArrayBuffer文件类型

npm install image-type -S

生成随机数

npm install randomstring -D

增加右击事件

点击右击事件的时候加载菜单

const imageRightSave = require("./ImageRightSave")  // 创建右击菜单
const imageSaveLocalUtil = require("../utils/ImageSaveLocalUtil");  // 保存图片到本地
let shortcutRegistered = false;  // 用于控制是否注册快捷键

// 监听右击事件
win.webContents.on('context-menu', (e, args) => {
  if (!args.srcURL) return  // 如果路由地址为空则不显示快捷键
  if (!shortcutRegistered) {
    globalShortcut.register("CommandOrControl+S", () => {
      imageSaveLocalUtil(args.srcURL)
    })
    shortcutRegistered = true
  }
  contextMenu = imageRightSave(args.srcURL)
  contextMenu.popup()

  contextMenu.on("menu-will-close", () => {
    globalShortcut.unregister("CommandOrControl+S")  // 注销快捷键
    shortcutRegistered = false
  })
})

编写菜单

注意:accelerator只负责显示快捷键,但是没有快捷键的功能,需要自己手动编写快捷键的规则。 切记 切记 切记!!!

const {Menu} = require('electron');
const imageSaveLocalUtil = require("../utils/ImageSaveLocalUtil")

const imageRightSave = (url) => {
  const template = [
    {
      label: "图片另存为...",
      accelerator: "CommandOrControl+S",  // 仅仅用于快捷键的显示,但是不会有快捷键的功能
      click: async () => {
        imageSaveLocalUtil(url)  // 保存图片到本地
      }
    }
  ]
  return Menu.buildFromTemplate(template)
}

module.exports = imageRightSave

保存本地

const {dialog} = require("electron");
const {default: got} = require("got");
const path = require("path");
const randomstring = require("randomstring");
const fs = require("fs");
const warningMessageUtil = require("./WarningMessageUtil");


/**
 * 加载文件类型
 * @param chunk
 */
async function loadFileType(chunk) {
  const imageType = (await import('image-type')).default;
  const imgType = await imageType(chunk)  // 现在您可以使用 imageType 了
  return imgType.ext;
}

/**
 * 将图片保存到本地
 */
const imageSaveLocalUtil = async (url) => {
  await got.get(url).then(async (res) => {
    const chunk = Buffer.from(res.rawBody);
    const suffix = await loadFileType(chunk)
    if (suffix == null || suffix == undefined || suffix == "") {
      warningMessageUtil("图片加载失败")
      return
    }
    const {filePath, canceled} = await dialog.showSaveDialog({
      title: '图片另存为',
      defaultPath: path.resolve(__dirname, '../../public/uploads/' + randomstring.generate(10) + "." + suffix),
    })
    if (canceled) return  // 用户点击了取消
    fs.writeFileSync(filePath, chunk)  // 数组写入本地
  }).catch((e) => {
    console.error(e)
  })
}

module.exports = imageSaveLocalUtil


警告消息提示

const {dialog, ipcMain} = require('electron');

const messagePrompt = (msg) => {
  dialog.showMessageBox({
    message: msg,
    type: 'warning',
  })
}

module.exports = messagePrompt

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在el-input搜索框组件的最后面,添加图标按钮?

1、问题描述 2、解决步骤 在el-input组件标签内,添加一个element-plus的自定义插槽, 在插槽里放一个图标按钮即可。 3、效果展示 结语 以上就是在搜索框组件的末尾添加搜索按钮的过程。 喜欢本篇文章的话,请关注本博主~~

NoteGen是一款开源跨平台的 AI 笔记应用,专注于 recording 和 writing ,基于 Tauri 开发

一、软件介绍 文末提供程序和源码下载 NoteGen 是一款专注于记录和写作的跨平台 AI 笔记应用,基于 Tauri 开发。NoteGen 的核心理念是将记录、写作和 AI 结合使用,三者相辅相成。记录功能可以帮助用户快速捕捉和整理碎片化知识。整理功能是连接记录和写…

第五次CCF-CSP认证(含C++源码)

第五次CCF-CSP认证 第一道(easy)思路及AC代码 第二道(easy)思路及AC代码solution 1solution 2 第三道(mid)思路及AC代码(mid) 第一道(easy) 题目链接 思路及…

个人学习编程(3-06) 搜索

树的高度&#xff1a; 题目&#xff1a; PS G:\vscodetest> .\ab.exe 5 5 1 2 1 4 1 5 2 3 3 #include <stdio.h> #include <vector> #include <queue> using namespace std; int main() {int n,m;scanf("%d %d",&n,&m);vector<vec…

springcloud sentinel教程

‌QPS&#xff08;Queries Per Second&#xff09;即每秒查询率 TPS&#xff0c;每秒处理的事务数目 PV&#xff08;page view&#xff09;即页面浏览量 UV 访问数&#xff08;Unique Visitor&#xff09;指独立访客访问数 一、初识Sentinel 什么是雪崩问题? 微服务之间相…

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(十一) 实现服务端和客户端socketio 连接

1.后端部分 socketIO文档参考Socket.IO 首先在lib下新建socket.js文件 参考服务器API | Socket.IO import {Server} from socket.io; import http from http import express from "express"const app express() const server http.createServer(app) const io …

【GoTeams】-3:构建api、重构错误码

本文目录 1. 构建api梳理调用关系api包的作用路由梳理注册Register代码语法 2. 重构错误码 1. 构建api 首先复制project-user&#xff0c;改名为project-api&#xff0c;放在总的路径下&#xff0c;然后在工作区中进行导入。 运行命令go work use .\project-api\新建工作区之…

《苍穹外卖》SpringBoot后端开发项目重点知识整理(DAY1 to DAY3)

目录 一、在本地部署并启动Nginx服务1. 解压Nginx压缩包2. 启动Nginx服务3. 验证Nginx是否启动成功&#xff1a; 二、导入接口文档1. 黑马程序员提供的YApi平台2. YApi Pro平台3. 推荐工具&#xff1a;Apifox 三、Swagger1. 常用注解1.1 Api与ApiModel1.2 ApiModelProperty与Ap…

BLUEM2引擎源码2025最新版

BLUE 引擎解析&#xff1a;传奇私服圈中的热门引擎 一、BLUE 引擎简介 BLUE 引擎是传奇私服圈子中较为知名的一款游戏引擎&#xff0c;它在传统的传奇引擎基础上进行了优化和扩展&#xff0c;使得私服开发者可以更加方便地搭建和管理服务器。相比于早期的 GEE、LEG、Hero 等引…

【RAG】检索后排序 提高回答精度

问题: RAG中&#xff0c;有时&#xff0c;最合适的答案不一定排在检索的最前面 user_query "how safe is llama 2" search_results vector_db.search(user_query, 5)for doc in search_results[documents][0]:print(doc"\n")response bot.chat(user_qu…

采用内存局部性分配有什么好处?

内存分配时的局部性分配&#xff08;Locality of Allocation&#xff09;是指将相关的内存对象分配在相邻或相近的内存区域中。这种分配策略在现代计算机系统中具有显著的好处&#xff0c;主要体现在以下几个方面&#xff1a; 1. 提高缓存命中率 现代计算机系统依赖于多级缓存…

【Dubbo+Zookeeper】——SpringBoot+Dubbo+Zookeeper知识整合

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

使用阿里云操作系统控制台排查内存溢出

引言 操作系统控制台是阿里云最新推出的一款智能运维工具&#xff0c;专为提升运维效率、优化服务器管理而设计。它集成了多种运维管理功能&#xff0c;包括操作系统助手、插件管理器以及其他实用工具&#xff0c;为用户提供一站式的运维解决方案。无论是个人开发者还是企业运…

3.3.2 Proteus第一个仿真图

文章目录 文章介绍0 效果图1 新建“点灯”项目2 添加元器件3 元器件布局接线4 补充 文章介绍 本文介绍&#xff1a;使用Proteus仿真软件画第一个仿真图 0 效果图 1 新建“点灯”项目 修改项目名称和路径&#xff0c;之后一直点“下一步”直到完成 2 添加元器件 点击元…

深入了解Linux —— 调试程序

前言 我们已经学习了linux下许多的工具&#xff0c;vim、gcc、make/makefile等&#xff1b; 已经能够在linux写代码&#xff0c;并且进行编译运行&#xff0c;让程序在linux下跑起来。 但是&#xff0c;如果我们在写代码的时候遇见了错误&#xff1b;但是我们并不知道错误在哪&…

Hive-优化(语法优化篇)

列裁剪与分区裁剪 在生产环境中&#xff0c;会面临列很多或者数据量很大时&#xff0c;如果使用select * 或者不指定分区进行全列或者全表扫描时效率很低。Hive在读取数据时&#xff0c;可以只读取查询中所需要的列&#xff0c;忽视其他的列&#xff0c;这样做可以节省读取开销…

八字排盘宝 2025.1.8 | 多模式排盘工具,精准解析八字信息,轻量易用

八字排盘宝是一款轻量高效的排盘工具&#xff0c;实现多模式排盘功能&#xff0c;界面简洁易用&#xff0c;适合命理爱好者和专业人士。支持多种排盘方式&#xff0c;精准解析八字信息&#xff0c;提供快速、便捷的命理分析体验&#xff0c;是日常排盘和命理学习的得力助手。 …

MySQL面试篇——性能优化

MySQL性能优化 在MySQL中&#xff0c;如何定位慢查询 慢查询表象&#xff1a;页面加载过慢、接口压测响应时间过长&#xff08;超过1s&#xff09;。造成慢查询的原因通常有&#xff1a;聚合查询、多表查询、表数据量过大查询、深度分页查询 方案一&#xff1a;开源工具 调试工…

c#财务软件专业版企业会计做账软件财务管理系统软件

本软件为绍兴客户开发的仿某碟财务软件专业版 功能&#xff1a;可以按会计科目做账录入会计凭证、结转损益、期末结账、拉资产负债表 github下载&#xff1a;https://github.com/oyangxizhe/financial.git

【含文档+PPT+源码】Python爬虫人口老龄化大数据分析平台的设计与实现

项目介绍 本课程演示的是一款Python爬虫人口老龄化大数据分析平台的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…