最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Electron實(shí)現(xiàn)右鍵保存圖片到本地功能

 更新時(shí)間:2024年07月28日 09:04:15   作者:mortimer  
Electron是開發(fā)跨平臺(tái)pc客戶端的利器,最近在使用它時(shí)遇到一個(gè)需要右鍵保存頁面中圖片的功能,Electron雖使用了Chromium內(nèi)核但卻無法直接使用系統(tǒng)右鍵,需要自定義右鍵菜單,然后添加圖片保存功能,以下是我的使用方法,需要的朋友可以參考下

Electron是開發(fā)跨平臺(tái)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請(qǐng)求圖片下載圖片數(shù)據(jù),復(fù)制到粘貼板并保存到計(jì)算機(jī)中。

聽起來很簡(jiǎn)單對(duì)吧,事實(shí)上也確實(shí)簡(jiǎn)單。就是一個(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í)行保存動(dòng)作。

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ù)并保存

這一步就比較簡(jiǎn)單了,使用axios請(qǐng)求圖片數(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript中window.showModalDialog()用法詳解

    JavaScript中window.showModalDialog()用法詳解

    這篇文章主要介紹了JavaScript中window.showModalDialog()用法詳解,需要的朋友可以參考下
    2014-12-12
  • 求js數(shù)組的最大值和最小值的四種方法

    求js數(shù)組的最大值和最小值的四種方法

    本篇文章主要介紹了求js數(shù)組的最大值和最小值的四種方法,具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • layui默認(rèn)選中table的CheckBox復(fù)選框方法

    layui默認(rèn)選中table的CheckBox復(fù)選框方法

    今天小編就為大家分享一篇layui默認(rèn)選中table的CheckBox復(fù)選框方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • JavaScript設(shè)計(jì)模式---單例模式詳解【四種基本形式】

    JavaScript設(shè)計(jì)模式---單例模式詳解【四種基本形式】

    這篇文章主要介紹了JavaScript設(shè)計(jì)模式---單例模式,結(jié)合實(shí)例形式詳細(xì)分析了JavaScript設(shè)模式中單例模式的四種基本形式定義與使用方法,需要的朋友可以參考下
    2020-05-05
  • 原生js實(shí)現(xiàn)拼圖效果

    原生js實(shí)現(xiàn)拼圖效果

    這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)拼圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • JS暴虐查找法簡(jiǎn)潔版

    JS暴虐查找法簡(jiǎn)潔版

    有過相關(guān)經(jīng)驗(yàn)的朋友都知道,Jscript的效率畢竟有限,在數(shù)組中查找數(shù)據(jù)時(shí)如果用常規(guī)的算法來做執(zhí)行起來會(huì)很慢。
    2008-07-07
  • JavaScript forEach 方法跳出循環(huán)的操作方法

    JavaScript forEach 方法跳出循環(huán)的操作方法

    這篇文章主要介紹了JavaScript forEach 方法跳出循環(huán)的操作方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • TypeScript編譯選項(xiàng)使用及說明

    TypeScript編譯選項(xiàng)使用及說明

    本文介紹了tsconfig.json文件的作用、結(jié)構(gòu)、常用編譯選項(xiàng)、不同環(huán)境配置建議、配置繼承與復(fù)用、常見問題與解決方案,并提供了常用編譯選項(xiàng)對(duì)比表,幫助開發(fā)者全面了解TypeScript項(xiàng)目的配置
    2026-04-04
  • 整理關(guān)于Bootstrap過渡動(dòng)畫的慕課筆記

    整理關(guān)于Bootstrap過渡動(dòng)畫的慕課筆記

    這篇文章主要為大家整理了關(guān)于Bootstrap動(dòng)畫過渡的慕課筆記,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • JS使用getComputedStyle()方法獲取CSS屬性值

    JS使用getComputedStyle()方法獲取CSS屬性值

    經(jīng)常會(huì)用到j(luò)s來獲取元素的CSS樣式,由于方法眾多,在下面的文章中為大家詳細(xì)整理下
    2014-04-04

最新評(píng)論

珲春市| 哈尔滨市| 鹰潭市| 新邵县| 临汾市| 固安县| 师宗县| 武宣县| 株洲市| 绥德县| 游戏| 宝兴县| 巴楚县| 外汇| 普定县| 高州市| 永德县| 拜城县| 肥东县| 琼结县| 简阳市| 庆阳市| 修武县| 黄龙县| 年辖:市辖区| 北安市| 浠水县| 汶上县| 邵东县| 右玉县| 贺兰县| 康乐县| 临湘市| 津市市| 津南区| 夹江县| 茂名市| 高平市| 永春县| 洛扎县| 琼中|