electron實現(xiàn)圖片的另存為功能
更新時間:2024年10月29日 10:15:22 作者:#做一個清醒的人
本文主要介紹了在electron中如何實現(xiàn)圖片的另存為操作,包括另存為按鈕事件的編寫,getImageType和saveAsPicture的主要代碼,以及Electron進程與渲染進程的交互效果,希望能為使用electron的開發(fā)者提供幫助
注:該列出的代碼,都在文章內示例出
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數(shù)據傳給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 數(shù)據 * @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) }) }) })
效果圖:
到此這篇關于electron實現(xiàn)圖片的另存為的文章就介紹到這了,更多相關electron圖片另存為內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JavaScript實現(xiàn)生成動態(tài)表格和動態(tài)效果的方法詳解
這篇文章主要介紹了如何通過JavaScript語言實現(xiàn)動圖表格的生成以及動態(tài)效果的實現(xiàn),文中的示例代碼講解詳細,感興趣的可以了解一下2022-02-02js 公式編輯器 - 自定義匹配規(guī)則 - 帶提示下拉框 - 動態(tài)獲取光標像素坐標
這篇文章主要介紹了js公式編輯器 - 自定義匹配規(guī)則 - 帶提示下拉框 - 動態(tài)獲取光標像素坐標的方法,,需要的朋友可以參考下2018-01-01.net MVC+Bootstrap下使用localResizeIMG上傳圖片
這篇文章主要為大家詳細介紹了.net MVC和Bootstrap下使用 localResizeIMG上傳圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04Javascript數(shù)組及類數(shù)組相關原理詳解
這篇文章主要介紹了Javascript數(shù)組及類數(shù)組相關原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10js監(jiān)聽輸入框值的即時變化onpropertychange、oninput
很多情況下我們都會即時監(jiān)聽輸入框值的變化,以便作出即時動作去引導瀏覽者增強網站的用戶體驗感。2011-07-07JavaScript中removeChild 方法開發(fā)示例代碼
這篇文章主要介紹了JavaScript中removeChild 方法開發(fā)示例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08