canvas如何调试(关于canvas.toDataURL 在iOS运行失败的问题解决)
canvas如何调试
关于canvas.toDataURL 在iOS运行失败的问题解决最近做了一个海报生成的组件,需要drawimage到画布上,image来源包括本地和异地的图片src;
首先讲一点,异地图片如果不设置允许跨域访问,canvas.toDataURL是无法画image的,报画布污染的错;首先放一张我要生成的图;
上面加载了两张本地图片,两张异地图片,写了一些文字;在windows谷歌浏览器跑是好的,是吧,图片画出来,感觉无压力;用安卓也是好的,很开心;可是到IOS手机上,我去,怎么图片显示不出来啊,然后
try catch 错误,没啥有用的信息;
try { // 将canvas对象转化为image.jpg" alt="canvas如何调试(关于canvas.toDataURL 在iOS运行失败的问题解决)" border="0" />
我擦,这怎么办???
然后去cnbing搜,好多相同问题,好多原因,有个老外说动态更改canvas宽高无法再ios画出图片;还有的人说:
图片文件 size 太大,是否图片超过了 3M ? -----------我看了下生成的图片才几百kb PASS
图片的 dimension 太大,是否图片尺寸超过了 1000 x 1000 像素?我的尺寸确实超过了,宽高都超了,然而测试了下小的宽高,照旧ios画不出来啊~~~PASS
你指定的 mime_type 不支持,你用的是哪个 mime type?—canvas的 toDataURL API我看过了,可以支持三个类型,各试了一遍,无果 PASS
先上我的代码:
<template> <li id="Poster"> <li class="mask" @click="hidePoster()"></li> <canvas ref="canvas" width="588" height="1044" style="display:none;"></canvas> <li ref="box" id="Poster-box" @click.stop> <span class="close" @click="hidePoster()"></span> </li> <p class="tip">长安按海报发送给朋友</p> </li> </template>
<script> export default { data () { // 参数 const u = navigator.userAgent // ios终端 const isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) // ios终端 return { // 返回参数 localUrl: isIOS ? location.href.split('#')[0] : location.href, // 当前路径 canvas: Object // canvas对象 } }, mounted () { this.initCanvas() }, methods: { /** * 隐藏海报 */ hidePoster () { this.$emit('hide') }, /** * 加载图片 * @param {Object} img 图片地址 * @return {Promise} img dom */ loadImage (img) { return new Promise((resolve, reject) => { // image dom 对象 const $image = document.createElement('img') if (img.isCross_domain) { console.log(img.url) $image.setAttribute('crossOrigin', 'Anonymous') } $image.onload = () => { resolve($image) } $image.src = img.url $image.onerror = reject }) }, /** * init初始化canvas函数 */ async initCanvas () { // 获取vue实例 var vm = this vm.$indicator.open({ text: '加载中...', spinnerType: 'fading-circle' }) this.canvas = this.$refs.canvas.getContext('2d') this.canvas.height = 400 this.canvas.width = 300 this.canvas.fillStyle = '#ffffff' this.canvas.fillRect(0, 0, 588, 1044) // image urls const imgArr = [ { url: require('../assets/poster-banner.jpg" alt="canvas如何调试(关于canvas.toDataURL 在iOS运行失败的问题解决)" border="0" />
盘查了好久,最后找到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.jpg" alt="canvas如何调试(关于canvas.toDataURL 在iOS运行失败的问题解决)" border="0" />
到此这篇关于关于canvas.toDataURL 在iOS运行失败的问题解决 的文章就介绍到这了,更多相关canvas.toDataURL在iOS运行失败内容请搜索开心学习网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持开心学习网!
- canvas如何调试(关于canvas.toDataURL 在iOS运行失败的问题解决)
- canvas怎么获取内容(详解canvas.toDataURL报错的解决方案全都在这了)
- 节日我在岗|警景相融 平安相伴(节日我在岗警景相融)
- 战 疫 时刻 致敬每一位石化大学的 守护者(战疫时刻)
- 老弄堂里的市井味道(老弄堂里的市井味道)
- 小米音乐可绑定QQ音乐, QQ音乐 真的会消失在小米的设备上吗(小米音乐可绑定QQ音乐)
- 小米Watch S1评测 或许能成为小米冲击高端可穿戴设备的里程碑(小米WatchS1评测或许能成为小米冲击高端可穿戴设备的里程碑)
- 手机QQ与小米路由器在一起 明天揭晓,敬请期待(手机QQ与小米路由器在一起)
热门推荐
- html正则表达式案例(关于html字符串正则判断和匹配的具体使用)
- SqlServer 英文单词全字匹配详解及实现代码(SqlServer 英文单词全字匹配详解及实现代码)
- python面向对象的介绍(Python面向对象思想与应用入门教程类与对象)
- mysql架构图(深入了解Mysql逻辑架构)
- django表单提交到数据库(Django 表单模型选择框如何使用分组)
- python用pyqt5制作登录界面(python3+pyqt5+itchat微信定时发送消息的方法)
- javascript的作用域详解精简版(浅谈JavaScript 中的延迟加载属性模式)
- 美国云服务器稳定吗(选择美国云服务器需要关注什么?)
- nginx报错处理(Nginx报504 gateway timeout错误的解决方法)
- dockerpull的镜像位置(解决docker pull镜像报错的问题)