脚本之家

电脑版
提示:原网页已由神马搜索转码, 内容由www.jb51.net提供.
您的位置:首页网络编程JavaScript→ JS图片URL转base64

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

  更新时间:2023年03月31日 09:09:02  作者:春风_同学 
这篇文章主要为大家介绍了JS实现将图片URL转base64示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

背景介绍

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

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

出现意外

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

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

进入正题吧

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

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会造成另一个问题:

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

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

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

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

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

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

nodejs中间层转

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的资料请关注脚本之家其它相关文章!

相关文章

    • 这篇文章主要为大家介绍了echart实现大屏动效示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
      2022-08-08
    • 这篇文章主要为大家介绍了Parcel配置public静态文件目录实现过程解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
      2023-06-06
    • 这篇文章主要为大家介绍了vscode工具函数once使用示例深入剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
      2023-03-03
    • 这篇文章主要介绍了微信小程序 网络API发起请求详解的相关资料,需要的朋友可以参考下
      2016-11-11
    • 编写微信小程序时,用到 wx.uploadFile,用来上传图片+文本信息,本篇文章主要介绍了微信小程序 wx.uploadFile 的编码坑,有兴趣的可以了解一下。
      2017-01-01
    • 这篇文章主要介绍了微信小程序 详解下拉加载与上拉刷新实现方法的相关资料,这里介绍了两种实现方法,需要的朋友可以参考下
      2017-01-01
    • 这篇文章主要为大家介绍了next.js源码解析getStaticProps getStaticPaths使用场景,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
      2023-08-08
    • 这篇文章主要为大家介绍了JS前端操作 Cookie源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
      2022-12-12
    • 这篇文章主要为大家介绍了JavaScript中使用toLocaleString数字格式化处理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
      2022-08-08
    • JavaScript 数组用于在单一变量中存储多个值,数组是一种特殊的变量,它能够一次存放一个以上的值。下面文章小编就来详细归纳一下JavaScript数组,需要的朋友可以参考一下
      2021-09-09

    最新评论