electron實現(xiàn)圖片的另存為功能
注:該列出的代碼,都在文章內(nèi)示例出
1. 另存為按鈕事件:
const saveAsHandler = async () => {
const { path, sessionId } = recordInfo
if(typeof message !== 'string') return;
// 因為我的圖片是加密的,所以我需要根據(jù)接口返回的路徑,然后根據(jù)不同圖片的密鑰(sessionId)去進行解密(decodeAvatarUrl)處理,最后返回blob,所以這塊兒不必糾結(jié)
const res = await decodeAvatarUrl(path, sessionId, false)
// blob轉(zhuǎn)ArrayBuffer
blobToArrayBuffer(res, async (buffer: ArrayBuffer) => {
const type = await getImageType(res) // 將Blob數(shù)據(jù)傳給getImageType,經(jīng)處理后獲取圖片類型, 請看標(biāo)題2的代碼示例
// saveAsPicture 這個就是渲染進程與Electron的通信 ,請看標(biāo)題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) => {
// 關(guān)于與Electron的UI.SAVEASPATH的通信,請看標(biāo)題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)
})
})
})效果圖:

到此這篇關(guān)于electron實現(xiàn)圖片的另存為的文章就介紹到這了,更多相關(guān)electron圖片另存為內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript實現(xiàn)生成動態(tài)表格和動態(tài)效果的方法詳解
這篇文章主要介紹了如何通過JavaScript語言實現(xiàn)動圖表格的生成以及動態(tài)效果的實現(xiàn),文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-02-02
js 公式編輯器 - 自定義匹配規(guī)則 - 帶提示下拉框 - 動態(tài)獲取光標(biāo)像素坐標(biāo)
這篇文章主要介紹了js公式編輯器 - 自定義匹配規(guī)則 - 帶提示下拉框 - 動態(tài)獲取光標(biāo)像素坐標(biāo)的方法,,需要的朋友可以參考下2018-01-01
.net MVC+Bootstrap下使用localResizeIMG上傳圖片
這篇文章主要為大家詳細(xì)介紹了.net MVC和Bootstrap下使用 localResizeIMG上傳圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
JavaScript實現(xiàn)網(wǎng)頁截屏的5種方法小結(jié)
本文主要介紹了JavaScript實現(xiàn)網(wǎng)頁截屏的5種方法小結(jié),感興趣的可以了解一下2009-10-10
Javascript數(shù)組及類數(shù)組相關(guān)原理詳解
這篇文章主要介紹了Javascript數(shù)組及類數(shù)組相關(guān)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10
js實現(xiàn)控制文件拖拽并獲取拖拽內(nèi)容功能
本片文章主要給大家分享了用JS寫出控制文件拖拽并獲取拖拽內(nèi)容功能實現(xiàn)過程,以及代碼分享,有興趣的一起學(xué)習(xí)下。2018-02-02
js監(jiān)聽輸入框值的即時變化onpropertychange、oninput
很多情況下我們都會即時監(jiān)聽輸入框值的變化,以便作出即時動作去引導(dǎo)瀏覽者增強網(wǎng)站的用戶體驗感。2011-07-07
JavaScript中removeChild 方法開發(fā)示例代碼
這篇文章主要介紹了JavaScript中removeChild 方法開發(fā)示例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08

