electron實現(xiàn)圖片的另存為功能
注:該列出的代碼,都在文章內(nèi)示例出
1. 另存為按鈕事件:
const saveAsHandler = async () => {
const { path, sessionId } = recordInfo
if(typeof message !== 'string') return;
// 因為我的圖片是加密的,所以我需要根據(jù)接口返回的路徑,然后根據(jù)不同圖片的密鑰(sessionId)去進行解密(decodeAvatarUrl)處理,最后返回blob,所以這塊兒不必糾結
const res = await decodeAvatarUrl(path, sessionId, false)
// blob轉ArrayBuffer
blobToArrayBuffer(res, async (buffer: ArrayBuffer) => {
const type = await getImageType(res) // 將Blob數(shù)據(jù)傳給getImageType,經(jīng)處理后獲取圖片類型, 請看標題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);
// 根據(jù)文件頭部的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ù)據(jù)
* @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圖片另存為內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
AutoJs4.4.1免費版快速接通vscode調(diào)試腳本的操作方法
這篇文章主要介紹了AutoJs4.4.1免費版快速接通vscode進行調(diào)試腳本,首先下載AutoJs并安裝,下載完成后,將2個apk文件拷貝到手機安裝即可,接下來需要安裝插件,本文分步驟給大家介紹的非常詳細,需要的朋友可以參考下2022-10-10
JavaScript switch case 的用法實例[范圍]
JavaScript switch case 的用法實例,大家可以參考下。2009-09-09
prototype.js簡單實現(xiàn)ajax功能示例
這篇文章主要介紹了prototype.js簡單實現(xiàn)ajax功能,結合實例形式分析了prototype.js前臺實現(xiàn)ajax與后臺struts的相關操作技巧,需要的朋友可以參考下2017-10-10
JS hasOwnProperty()方法檢測一個屬性是否是對象的自有屬性的方法
這篇文章主要介紹了JS hasOwnProperty()方法檢測一個屬性是否是對象的自有屬性的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01
Chrome不支持showModalDialog模態(tài)對話框和無法返回returnValue問題的解決方法
上個禮拜修改測試一個后臺管理項目,在測試與各個瀏覽器兼容性的時候,發(fā)現(xiàn)在chrome瀏覽器下showModalDialog方法顯示的并不是模態(tài)對話框,就像新打開一個頁面一樣,父窗口仍然可以隨意獲取焦點,并可以打開多個窗體,而且返回值returnValue也無法返回,一直是undefined2016-10-10
Bootstrap的popover(彈出框)2秒后定時消失的實現(xiàn)代碼
Bootstrap Popover(彈出框)是使用定制的 Jquery 插件創(chuàng)建的。它可以用來顯示任何元素的一些信息。這篇文章主要介紹了Bootstrap的popover(彈出框)2秒后定時消失功能,需要的朋友參考下2017-02-02
javascript 實現(xiàn)父窗口引用彈出窗口的值的腳本
javascript 實現(xiàn)父窗口引用彈出窗口的值的腳本...2007-08-08

