您现在的位置是:网站首页> 编程资料编程资料
关于canvas.toDataURL 在iOS运行失败的问题解决 详解canvas.toDataURL()报错的解决方案全都在这了canvas.toDataURL image/png 报错处理方法推荐
2021-08-30
1154人已围观
简介 这篇文章主要介绍了关于canvas.toDataURL 在iOS运行失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
最近做了一个海报生成的组件,需要drawimage到画布上,image来源包括本地和异地的图片src;
首先讲一点,异地图片如果不设置允许跨域访问,canvas.toDataURL是无法画image的,报画布污染的错;首先放一张我要生成的图;

上面加载了两张本地图片,两张异地图片,写了一些文字;在windows谷歌浏览器跑是好的,是吧,图片画出来,感觉无压力;用安卓也是好的,很开心;可是到IOS手机上,我去,怎么图片显示不出来啊,然后
try catch 错误,没啥有用的信息;
try { // 将canvas对象转化为image/png var dataUrl = canvas.toDataURL('image/png') } catch (err) { console.log(err) } 我擦,这怎么办???
然后去cnbing搜,好多相同问题,好多原因,有个老外说动态更改canvas宽高无法再ios画出图片;还有的人说:
图片文件 size 太大,是否图片超过了 3M ? -----------我看了下生成的图片才几百kb PASS
图片的 dimension 太大,是否图片尺寸超过了 1000 x 1000 像素?我的尺寸确实超过了,宽高都超了,然而测试了下小的宽高,照旧ios画不出来啊~~~PASS
你指定的 mime_type 不支持,你用的是哪个 mime type?—canvas的 toDataURL API我看过了,可以支持三个类型,各试了一遍,无果 PASS
先上我的代码:
长安按海报发送给朋友
盘查了好久,最后找到bug,就是下面这个function
/** * 加载图片 * @param {Object} img 图片地址 * @return {Promise} img dom */ loadImage (img) { return new Promise((resolve, reject) => { // image dom 对象 const $image = document.createElement('img') $image.src = img.url if (img.isCross_domain) { console.log(img.url) $image.setAttribute('crossOrigin', 'Anonymous') } $image.onload = () => { resolve($image) } $image.onerror = reject }) }, 有没有注意到crossOrigin属性是在src属性之后赋值的;/(ㄒoㄒ)/~~crossOrigin属性必须在src属性之前赋值crossOrigin属性必须在src属性之前赋值crossOrigin属性必须在src属性之前赋值
尽管没有找到准确的文档明确指定crossOrigin属性必须在src属性之前赋值,但是要适配IOS确实要这么做;
大家如果对 crossorigin 有疑问可以看一下MDN对crossorigin的解释:
https://developer.mozilla.org/zh-CN/docs/Web/HTML/CORS_enabled_image
里面讲了画布的污染和解决方法,就是设置 crossorigin = “Anonymous”;里面的方法也是先设置crossorigin在图片加载完后设置 src;
如下
var img = new Image, canvas = document.createElement("canvas"), ctx = canvas.getContext("2d"), src = "http://example.com/image"; // insert image url here img.crossOrigin = "Anonymous"; img.onload = function() { canvas.width = img.width; canvas.height = img.height; ctx.drawImage( img, 0, 0 ); localStorage.setItem( "savedImageData", canvas.toDataURL("image/png") ); } img.src = src; // make sure the load event fires for cached images too if ( img.complete || img.complete === undefined ) { img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="; img.src = src; } 到此这篇关于关于canvas.toDataURL 在iOS运行失败的问题解决 的文章就介绍到这了,更多相关canvas.toDataURL在iOS运行失败内容请搜索以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!
相关内容
- canvas绘制图片drawImage使用方法详解canvas drawImage()方法绘制图片不显示的问题HTML5 Canvas API中drawImage()方法的使用实例
- HTML5中外部浏览器唤起微信分享功能的代码html5的pushstate以及监听浏览器返回事件的实现HTML5中外部浏览器唤起微信分享html5使用html2canvas实现浏览器截图的示例处理HTML5新标签的浏览器兼容版问题如何查看浏览器对html5的支持情况
- 如何使用canvas绘制可移动网格的示例代码详解使用HTML5 Canvas创建动态粒子网格动画
- HTML5 body设置全屏背景图片的示例代码HTML5轻松实现全屏视频背景的示例HTML5画渐变背景图片并自动下载实现步骤
- Html5基于canvas实现电子签名并生成PDF文档canvas画布实现手写签名效果的示例代码html5 利用canvas手写签名并保存的实现方法如何用canvas实现在线签名的示例代码
- HTML5基于flash实现播放RTMP协议视频的示例代码HTML5播放实现rtmp流直播使用HTML5加载音频和视频的实现代码Html5 webRTC简单实现视频调用的示例代码HTML5 video循环播放多个视频的方法步骤HTML5 通过Vedio标签实现视频循环播放的示例代码html5视频自动横过来自适应页面且点击播放功能的实现
- 前端水印的简单实现代码示例前端canvas水印快速制作(附完整代码)手摸手教你用canvas实现给图片添加平铺水印的实现html5 canvas实现给图片添加平铺水印canvas 下载二维码和图片加水印的方法前端使用canvas生成盲水印的加密解密的实现
- html5跳转小程序wx-open-launch-weapp踩坑 HTML5跳转小程序wx-open-launch-weapp的示例代码
- Bootstrap File Input文件上传组件jquery+bootstrap实现图片上传插件
- HTML5单选框、复选框、下拉菜单、文本域的实现代码HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码html5写一个BUI折叠菜单插件的实现方法html滑动仿悬浮球菜单效果的实现
