当前位置: 首页 > news >正文

canvas.toDataURL生成图片报错的解决方案

问题原因:

toDataURL方法存在跨域限制,如果执行时dom内含有跨域的图片则浏览器执行时会报错。
这个根据不同的系统有不同的表现,例如:生成完毕但控制台有warning类型的警告,或者直接异常报error。

解决思路:

解决图片的跨域问题需要前后的配合进行,测试进行时发现服务端是支持CORS跨域的,因此在前端设置下img的CORS属性即可,如果设置后不生效的话需要考虑下是不是由于请求资源都会在CDN服务器中缓存,所以设置后会存在不生效的情况。此情况在图片地址后追加时间戳,绕过CDN直接请求服务器即可。由于项目开发情况复杂,在头部进行统一设置,就不用考虑插件差异的情况了;

解决方案:

资源服务器给图片设置cors请求头允许跨域请求,前端设置图片的crossOrigin属性为anonymous来允许跨域,并且在图片后缀添加时间戳,防止请求CDN缓存资源;

完整示例代码如下:

<!DOCTYPE html>
<html lang="zh"><head><meta charset="UTF-8"><title>Document</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.0/jquery.min.js"></script><script>$(document).ready(function () {var imgs = $('img');for (var i = 0; i < imgs.length; i++) {imgs[i].crossOrigin = "Anonymous"imgs[i].src = imgs[i].src + '?' + (+new Date());}})</script>
</head><body>原图(注意观察图片追加的时间戳与属性):<img id="test" src="自行替换" alt=""><hr>生成:
</body><script>function convertImageToCanvas(image) {var canvas = document.createElement("canvas");canvas.width = image.width;canvas.height = image.height;canvas.getContext("2d").drawImage(image, 0, 0);return canvas;}function convertCanvasToImage(canvas) {var image = new Image();image.src = canvas.toDataURL("image/png");return image;}function draw(img) {var cs = convertImageToCanvas(img);var image = convertCanvasToImage(cs);document.body.appendChild(image);}window.onload = function () {var img = document.getElementById("test");img.onload = draw(img);}
</script>
</html>
http://www.lryc.cn/news/58267.html

相关文章:

  • 电容笔和Apple pencil的区别是什么?好用电容笔推荐
  • 关于onnx 转ncnn 的问题
  • 设计模式之《责任链模式》
  • Android Studio实现多功能日记本
  • 只依赖Tensorrt和opencv的yolov5源代码
  • 多路I/O转接 poll(了解)
  • 听说你也在为配置tomcat server而烦恼,看我这一篇,让你醍醐灌顶!
  • 【从零开始学Skynet】工具篇(二):虚拟机文件的复制粘贴
  • 全球自动驾驶竞争力最新排行榜,4家中国企业上榜
  • APP启动流程分析
  • IIR数字滤波器简介与实现
  • 3.5 函数的极值与最大值和最小值
  • 第五十八天打卡
  • 双一流大学计算机专业月薪拿2000?网友:我裂开
  • ChatGPT的“N宗罪”?|AI百态(上篇)
  • 48.现有移动端开源框架及其特点—MDL(mobile-deep-learning)
  • 4.9--计算机网络之TCP篇之TCP Keepalive 和 HTTP Keep-Alive --(复习+大总结)---沉淀ing
  • qt完善登录界面(2023-4-6)
  • 104.(cesium篇)cesium卫星轨道模拟
  • Linux shell编程
  • Rasa 3.x 学习系列-Rasa [3.5.4] -2023-04-05新版本发布
  • 进程和线程
  • ps 备忘清单_开发速查表分享
  • 【ROS】基于WIFI网络实现图像消息跨机实时传输
  • 一次性说清楚 JAVA的 ThreadPoolExecutor 、newFixedThreadPool 和newCachedThreadPool 等
  • Android双目三维重建:Android双目摄像头实现双目测距
  • 解决Avoid using non-primitive value as key, use string/number value instead.
  • 重构·改善既有代码的设计.03之重构手法(上)
  • 闭关修炼(0.0 pytorch基础学习)1
  • 个人-计算机操作系统第一章