electron實(shí)現(xiàn)圖片的另存為功能
注:該列出的代碼,都在文章內(nèi)示例出
1. 另存為按鈕事件:
const saveAsHandler = async () => {
const { path, sessionId } = recordInfo
if(typeof message !== 'string') return;
// 因?yàn)槲业膱D片是加密的,所以我需要根據(jù)接口返回的路徑,然后根據(jù)不同圖片的密鑰(sessionId)去進(jìn)行解密(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)處理后獲取圖片類型, 請(qǐng)看標(biāo)題2的代碼示例
// saveAsPicture 這個(gè)就是渲染進(jìn)程與Electron的通信 ,請(qǐng)看標(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來(lái)讀取文件頭部
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的主要代碼:
/** 校驗(yàn):另存為 */
type saveAsPicturePrams = {
buffer: ArrayBuffer;
name: string;
type: string;
}
/** 另存為 */
export const saveAsPicture = (params: saveAsPicturePrams) => {
// 關(guān)于與Electron的UI.SAVEASPATH的通信,請(qǐng)看標(biāo)題4
return ipcRenderer.invoke(UI.SAVEASPATH, params)
}4. Electron進(jìn)程與渲染進(jìn)程的交互
/**
* 對(duì)話窗口:另存為圖片時(shí),需要獲取選擇要存儲(chǔ)的路徑
* @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實(shí)現(xiàn)圖片的另存為的文章就介紹到這了,更多相關(guān)electron圖片另存為內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
AutoJs4.4.1免費(fèi)版快速接通vscode調(diào)試腳本的操作方法
這篇文章主要介紹了AutoJs4.4.1免費(fèi)版快速接通vscode進(jìn)行調(diào)試腳本,首先下載AutoJs并安裝,下載完成后,將2個(gè)apk文件拷貝到手機(jī)安裝即可,接下來(lái)需要安裝插件,本文分步驟給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10
JavaScript switch case 的用法實(shí)例[范圍]
JavaScript switch case 的用法實(shí)例,大家可以參考下。2009-09-09
JavaScript獲取IP獲取的是IPV6 如何校驗(yàn)
項(xiàng)目中遇到了關(guān)于IPV6的一些問題,特意做一個(gè)專輯說(shuō)明一下,希望能夠幫助有需要的同學(xué)!2016-06-06
prototype.js簡(jiǎn)單實(shí)現(xiàn)ajax功能示例
這篇文章主要介紹了prototype.js簡(jiǎn)單實(shí)現(xiàn)ajax功能,結(jié)合實(shí)例形式分析了prototype.js前臺(tái)實(shí)現(xiàn)ajax與后臺(tái)struts的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
JS hasOwnProperty()方法檢測(cè)一個(gè)屬性是否是對(duì)象的自有屬性的方法
這篇文章主要介紹了JS hasOwnProperty()方法檢測(cè)一個(gè)屬性是否是對(duì)象的自有屬性的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Chrome不支持showModalDialog模態(tài)對(duì)話框和無(wú)法返回returnValue問題的解決方法
上個(gè)禮拜修改測(cè)試一個(gè)后臺(tái)管理項(xiàng)目,在測(cè)試與各個(gè)瀏覽器兼容性的時(shí)候,發(fā)現(xiàn)在chrome瀏覽器下showModalDialog方法顯示的并不是模態(tài)對(duì)話框,就像新打開一個(gè)頁(yè)面一樣,父窗口仍然可以隨意獲取焦點(diǎn),并可以打開多個(gè)窗體,而且返回值returnValue也無(wú)法返回,一直是undefined2016-10-10
Bootstrap的popover(彈出框)2秒后定時(shí)消失的實(shí)現(xiàn)代碼
Bootstrap Popover(彈出框)是使用定制的 Jquery 插件創(chuàng)建的。它可以用來(lái)顯示任何元素的一些信息。這篇文章主要介紹了Bootstrap的popover(彈出框)2秒后定時(shí)消失功能,需要的朋友參考下2017-02-02
javascript 實(shí)現(xiàn)父窗口引用彈出窗口的值的腳本
javascript 實(shí)現(xiàn)父窗口引用彈出窗口的值的腳本...2007-08-08

