服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服务器之家 - 编程语言 - JavaScript - js教程 - JS实现将图片URL转base64示例详解

JS实现将图片URL转base64示例详解

2023-04-03 15:11春风_同学 js教程

这篇文章主要为大家介绍了JS实现将图片URL转base64示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

背景介绍

最近有个需求是将部分DOM生成图片上传到服务器,这里就直接用之前项目使用的 html-to-image。

然而,这次与上次不同的是有一个图片;其实,html-to-image也支持了存在图片的DOM生成截图(embed-images)。

出现意外

不出意外的就该出意外了:

JS实现将图片URL转base64示例详解

很容易理解,就是跨域了请求了。注意,这里本来之前使用img标签是能正常请求的,并且也不用加crossorigin属性。 在调用html-to-image中加上mode: 'no-cors'依然不行。

进入正题吧

然后就想自己搞转base64吧,各种百度谷歌出来了

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const image2Base64 = (url: string) => new Promise((resolve, reject) => {
  if (!url) {
    resolve('');
    return;
  }
  const img = new Image();
  img.crossOrigin = 'anonymous';
  img.src = url;
  img.onload = () => {
    const canvas = document.createElement('canvas');
    canvas.width = img.width;
    canvas.height = img.height;
    const ctx = canvas.getContext('2d');
    ctx?.drawImage(img, 0, 0);
    const data = canvas.toDataURL();
    resolve(data);
  };
  img.onerror = () => {
    reject('');
  };
});

特别需要注意的是:img标签属性是crossorigin,new Image需使用crossOrigin。 如果不设置crossOrigin会造成另一个问题:

JS实现将图片URL转base64示例详解

在用canvas调用toDataURL方法中出错了。

然后又是各种百度谷歌,发现MDN有个权威又无语的解释:

JS实现将图片URL转base64示例详解

提炼一下哈:指定crossorigin的图像,在canvas调用中不会出现tainted错误。

其实上面已经能解决大多数的问题了:

JS实现将图片URL转base64示例详解

对,没猜错,事情没有绝对的,还是有个例的:

JS实现将图片URL转base64示例详解

不知是这个图片服务器咋设置的,各种吧啦吧啦沟通也不给设置跨域白名单啥的,只能自己想办法了。

nodejs中间层转

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const http = require('http');
http.get(url, (res) => {
  const chunks = [];
  let size = 0;
  res.on('data', (chunk) => {
    chunks.push(chunk);
    size += chunk.length;
  });
  res.on('end', () => {
    const data = Buffer.concat(chunks, size);
    const base64Data = data.toString('base64');
    return base64Data;
  });
});

结果,完美解决。

总结

  • 使用crossOrigin能解决大多数情况
  • 如果能在图片服务器加跨域白名单最好
  • 终极大招就是nodejs转
  • nodejs弊端:对于图片无法使用CDN,对服务器压力增大,慎用

以上就是JS实现将图片URL转base64示例详解的详细内容,更多关于JS图片URL转base64的资料请关注服务器之家其它相关文章!

延伸 · 阅读

精彩推荐
  • js教程JavaScript实现简单的计算器功能

    JavaScript实现简单的计算器功能

    这篇文章主要为大家详细介绍了JavaScript实现简单的计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    小小小青台7732022-02-22
  • js教程微信小程序实现文字滚动

    微信小程序实现文字滚动

    这篇文章主要为大家详细介绍了微信小程序实现文字滚动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    huangzhin4472022-02-19
  • js教程前端高效开发必备的 JS 库梳理

    前端高效开发必备的 JS 库梳理

    之前有很多人问学好前端需要学习哪些 js 库, 主流框架应该学 vue 还是 react ? 针对这些问题, 笔者来说说自己的看法和学习总结....

    前端大全6072022-01-22
  • js教程typescript编写微信小程序创建项目的方法

    typescript编写微信小程序创建项目的方法

    这篇文章主要介绍了typescript编写微信小程序创建项目的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以...

    无聊的人_nikolas5972022-01-11
  • js教程js闭包和垃圾回收机制示例详解

    js闭包和垃圾回收机制示例详解

    这篇文章主要给大家介绍了关于js闭包和垃圾回收机制的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,...

    丶Serendipity丶8212022-01-24
  • js教程javascript实现倒计时提示框

    javascript实现倒计时提示框

    这篇文章主要为大家详细介绍了javascript实现倒计时提示框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    友人CWH8582022-01-25
  • js教程Bootstrap FileInput实现图片上传功能

    Bootstrap FileInput实现图片上传功能

    这篇文章主要为大家详细介绍了Bootstrap FileInput实现图片上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    RNG-航仔8552022-01-10
  • js教程用 JavaScript 实现一个简单的笔记应用程序

    用 JavaScript 实现一个简单的笔记应用程序

    记笔记是学习新知识技能比较好的做法。记笔记的一些好处是:记笔记可以作为学习辅助工具,记笔记可以提高注意力和对细节的关注,促进主动学习,并...

    web前端开发7952022-10-24