当前位置: 代码网 > it编程>编程语言>Javascript > electron实现图片的另存为功能

electron实现图片的另存为功能

2024年11月26日 Javascript 我要评论
注:该列出的代码,都在文章内示例出1. 另存为按钮事件:const saveashandler = async () => { const { path, sessionid } = re

注:该列出的代码,都在文章内示例出

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数据传给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 数据
 * @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实现图片的另存为的文章就介绍到这了,更多相关electron图片另存为内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com