Electron實(shí)現(xiàn)右鍵保存圖片到本地功能
Electron是開發(fā)跨平臺pc客戶端的利器,最近在使用它時(shí)遇到一個(gè)需要右鍵保存頁面中圖片的功能,我們知道Chrome瀏覽器本身在圖片上右鍵保存圖片即可,但Electron雖使用了Chromium內(nèi)核但卻無法直接使用系統(tǒng)右鍵,需要自定義右鍵菜單,然后添加圖片保存功能。以下是我的使用方法。
Electron
是雙進(jìn)程模式,即用于頁面渲染的渲染器進(jìn)程,和作為程序入口及窗口管理的主進(jìn)程,想必大家都曉得。
保存圖片的核心原理即: 在渲染進(jìn)程中監(jiān)聽右鍵context
事件,獲取到圖片的src
,然后將src
發(fā)送到主進(jìn)程,主進(jìn)程監(jiān)聽到發(fā)送事件后,獲取src
地址,然后調(diào)用axios
等http請求圖片下載圖片數(shù)據(jù),復(fù)制到粘貼板并保存到計(jì)算機(jī)中。
聽起來很簡單對吧,事實(shí)上也確實(shí)簡單。就是一個(gè)渲染進(jìn)程和主進(jìn)程進(jìn)行一次通信,就ok。
渲染進(jìn)程監(jiān)聽context事件獲取圖片地址
和普通網(wǎng)頁中監(jiān)聽一樣,使用window.addEventListen('context'
,唯一需要注意的是獲取electron
的方式,可以通過preload
腳本將electron
注入到網(wǎng)頁,也可以直接在創(chuàng)建主窗口時(shí) nodeIntegration
設(shè)為true
,contextIsolation
設(shè)為false
從而在網(wǎng)頁中直接使用,當(dāng)然后者并不安全,不建議使用。
window.addEventListener('contextmenu',function(e){ let Renderer = (window.require && window.require('electron')) || window.electron || {}; const ipc = Renderer.ipcRenderer || undefined; if(ipc){ ipc.invoke('saveimg', {src:e.srcElement && e.srcElement.currentSrc?e.srcElement.currentSrc:''}).then(r => { // r為返回的數(shù)據(jù) console.log(r); }) e.preventDefault(); } });
如上代碼,當(dāng)在圖片上右鍵時(shí),可通過e.srtElement.currentSrc
取得圖片地址,然后使用 Render.ipcRenderer.invoke
發(fā)送給主進(jìn)程,當(dāng)然如果不需要接收返回?cái)?shù)據(jù),使用 send
也是可以
主進(jìn)程接收數(shù)據(jù)并保存圖片
主進(jìn)程通過 ipcMain.handle
監(jiān)聽渲染進(jìn)程發(fā)來的數(shù)據(jù),第二個(gè)參數(shù)args
即是渲染進(jìn)程發(fā)送的數(shù)據(jù),通過args.src
可獲取到圖片地址,然后調(diào)用 saveImage
函數(shù)保存圖片到本地。
為方便使用,可在接到該事件時(shí),添加一個(gè)右鍵菜單,只有當(dāng)點(diǎn)擊右鍵菜單中的“保存圖片到本地”才真正執(zhí)行保存動作。
const { app, BrowserWindow, ipcMain,nativeImage, dialog,Menu, MenuItem } = require('electron') ipcMain.handle(event,args){ const template = [ { label: '保存圖片到本地', accelerator: 'CmdOrCtrl+I', enabled: args.src?true:false, click: () => { if(args.src){ saveImage(mainWindow,args.src) } } } ] const menu=Menu.buildFromTemplate(template); menu.popup() }
獲取圖片數(shù)據(jù)并保存
這一步就比較簡單了,使用axios
請求圖片數(shù)據(jù),然后調(diào)用fs.writeFile
寫入本地文件即可
const axios =require('axios'); const fs =require('fs'); const path = require('path'); async function saveImage(mainWindow,imageUrl) { try { const { filePath } = await dialog.showSaveDialog(mainWindow, { title: '保存圖片', defaultPath: path.join(app.getPath('downloads'), (new Date()).getTime()+'image.jpg'), // 默認(rèn)保存路徑 }); if (!filePath) { throw new Error('用戶取消了保存操作'); } // 使用 axios 獲取圖片數(shù)據(jù) const response = await axios({ url: imageUrl, method: 'GET', responseType: 'arraybuffer', }); if (!response || response.status !== 200) { throw new Error(`圖片下載失敗,狀態(tài)碼:${response.status}`); } // 將響應(yīng)數(shù)據(jù)寫入文件 const buffer = Buffer.from(response.data); fs.writeFile(filePath, buffer, (err) => { if (err) { throw err; } console.log('圖片保存成功'); }); } catch (error) { console.error('保存圖片時(shí)發(fā)生錯(cuò)誤:', error.message); } }
最終效果如右圖,額外加了復(fù)制和粘貼等功能
到此這篇關(guān)于Electron實(shí)現(xiàn)右鍵保存圖片到本地功能的文章就介紹到這了,更多相關(guān)Electron右鍵保存圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
收集的比較全的automation服務(wù)器不能創(chuàng)建對象 異常原因和解決方法
對于出現(xiàn)automation服務(wù)器不能創(chuàng)建對象的問題,下面有幾種解決方法大家可以試試。2008-10-10淺談函數(shù)調(diào)用的不同方式,以及this的指向
下面小編就為大家?guī)硪黄獪\談函數(shù)調(diào)用的不同方式,以及this的指向。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09JS彈出可拖拽可關(guān)閉的div層完整實(shí)例
這篇文章主要介紹了JS彈出可拖拽可關(guān)閉的div層完整實(shí)現(xiàn)方法,包括對div彈出層的樣式及功能的實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02JavaScript實(shí)現(xiàn)簡單的拖動效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡單的拖動效果,具有一定的參考價(jià)值,感興趣的朋友可以參考一下2016-07-07實(shí)例詳解display:none與visible:hidden的區(qū)別
這篇文章主要介紹了實(shí)例詳解display:none與visible:hidden的區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-03-03使用Bootstrap美化按鈕實(shí)例代碼(demo)
這篇文章主要介紹了使用Bootstrap美化按鈕實(shí)例代碼(demo),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02JavaScript通過RegExp實(shí)現(xiàn)客戶端驗(yàn)證處理程序
通過RegExp實(shí)現(xiàn)客戶端驗(yàn):讓文本框只允許輸入數(shù)字、文本框只允許輸入中文、郵箱輸入格式的判斷等等,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈2013-05-05JavaScript實(shí)現(xiàn)俄羅斯方塊游戲過程分析及源碼分享
這篇文章主要介紹了JavaScript實(shí)現(xiàn)俄羅斯方塊游戲過程分析及源碼分享,本文分解了游戲規(guī)則、實(shí)現(xiàn)過程、難點(diǎn)分析及實(shí)現(xiàn)源碼,需要的朋友可以參考下2015-03-03