我的编程空间,编程开发者的网络收藏夹
学习永远不晚

canvas.toDataURL在iOS运行失败怎么办

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

canvas.toDataURL在iOS运行失败怎么办

这篇文章将为大家详细讲解有关canvas.toDataURL在iOS运行失败怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

最近做了一个海报生成的组件,需要drawimage到画布上,image来源包括本地和异地的图片class="lazy" data-src;
首先讲一点,异地图片如果不设置允许跨域访问,canvas.toDataURL是无法画image的,报画布污染的错;首先放一张我要生成的图;

canvas.toDataURL在iOS运行失败怎么办

上面加载了两张本地图片,两张异地图片,写了一些文字;在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
先上我的代码:

<template>    <div id="Poster">        <div class="mask" @click="hidePoster()"></div>        <canvas ref="canvas" width="588" height="1044" style="display:none;"></canvas>        <div ref="box" id="Poster-box" @click.stop>          <span class="close"  @click="hidePoster()"></span>        </div>        <p class="tip">长安按海报发送给朋友</p>    </div></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')    },        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.class="lazy" data-src = img.url        $image.onerror = reject      })    },        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.png'),          isCross_domain: false        },        {          url: require('../assets/shadow.png'),          isCross_domain: false        },        {          url: 'https://s3-011-shinho-syj-uat-bjs.s3.cn-north-1.amazonaws.com.cn/mall/2019_06/border04.png',          isCross_domain: true        },        {          url: 'https://s3-011-shinho-syj-uat-bjs.s3.cn-north-1.amazonaws.com.cn/mall/2019_06/132.jpg',          isCross_domain: true        }      ]      // image doms      await Promise.all(imgArr.map(img => this.loadImage(img))).then((imgs) => {        console.log('done')        this.canvas.drawImage(imgs[0], 0, 0, 588, 216 * 2)        this.canvas.drawImage(imgs[1], 97 * 2, 166 * 2, 100 * 2, 100 * 2)        this.canvas.save()        this.canvas.beginPath()        this.canvas.arc(147 * 2, 214 * 2, 34 * 2, 0, 2 * Math.PI, false)        this.canvas.clip()        this.canvas.drawImage(imgs[2], 113 * 2, 180 * 2, 68 * 2, 68 * 2)        this.canvas.restore()        this.canvas.drawImage(imgs[3], 189 * 2, 409 * 2, 88 * 2, 88 * 2)        // 绘制文字        this.drawText('我就是个我就账号账号', 147 * 2, 278 * 2, 290 * 2, '#333333', '32px PingFangSC-Regular ')        this.drawText('荣誉称号是我', 147 * 2, 300 * 2, 290 * 2, '#999999', '26px PingFangSC-Regular ')        this.drawText('距离冲榜还差10人', 147 * 2, 340 * 2, 290 * 2, '#FA6F5B', 'bold 36px arial')        this.drawText('快来助我冲榜赢红烧酱油吧', 147 * 2, 370 * 2, 290 * 2, '#FA6F5B', 'bold 36px arial ')        this.drawText('扫描二维码', 180 * 2, 443 * 2, 172 * 2, '#333333', '28px PingFangSC-Regular ', 'right')        this.drawText('直达冲榜活动', 180 * 2, 463 * 2, 172 * 2, '#333333', '28px PingFangSC-Regular ', 'right')        this.drawText('邀请好友跟你一起冲大奖', 180 * 2, 483 * 2, 172 * 2, '#333333', '28px PingFangSC-Regular ', 'right')        this.showPic()        vm.$indicator.close()      })    },        drawText (title, x, y, maxwidth, color, font, textalign = 'center') {      this.canvas.font = font      this.canvas.textAlign = textalign      this.canvas.fillStyle = color      this.canvas.fillText(title, x, y, maxwidth)    },        showPic () {      // 获取canvas对象      let canvas = this.$refs.canvas      try {        // 将canvas对象转化为image/png        var dataUrl = canvas.toDataURL('image/png')      } catch (err) {        console.log(err)      }      // 创建img 元素      var newImg = document.createElement('img')      newImg.class="lazy" data-src = dataUrl      newImg.style.width = '100%'      newImg.style.height = '100%'      newImg.className = 'img-poster'      newImg.style.borderRadius = '8px'      this.$refs.box.appendChild(newImg)    }  }}</script>

盘查了好久,最后找到bug,就是下面这个function

     loadImage (img) {      return new Promise((resolve, reject) => {        // image dom 对象        const $image = document.createElement('img')        $image.class="lazy" data-src = img.url        if (img.isCross_domain) {          console.log(img.url)          $image.setAttribute('crossOrigin', 'Anonymous')        }        $image.onload = () => {          resolve($image)        }        $image.onerror = reject      })    },

有没有注意到crossOrigin属性是在class="lazy" data-src属性之后赋值的;/(ㄒoㄒ)/~~
crossOrigin属性必须在class="lazy" data-src属性之前赋值
crossOrigin属性必须在class="lazy" data-src属性之前赋值
crossOrigin属性必须在class="lazy" data-src属性之前赋值
尽管没有找到准确的文档明确指定crossOrigin属性必须在class="lazy" data-src属性之前赋值,但是要适配IOS确实要这么做;
大家如果对 crossorigin 有疑问可以看一下MDN对crossorigin的解释:
https://developer.mozilla.org/zh-CN/docs/Web/HTML/CORS_enabled_image

里面讲了画布的污染和解决方法,就是设置 crossorigin = “Anonymous”;里面的方法也是先设置crossorigin在图片加载完后设置 class="lazy" data-src;
如下

var img = new Image,    canvas = document.createElement("canvas"),    ctx = canvas.getContext("2d"),    class="lazy" data-src = "http://example.com/image"; // insert image url hereimg.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.class="lazy" data-src = class="lazy" data-src;// make sure the load event fires for cached images tooif ( img.complete || img.complete === undefined ) {    img.class="lazy" data-src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";    img.class="lazy" data-src = class="lazy" data-src;}

关于“canvas.toDataURL在iOS运行失败怎么办”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

canvas.toDataURL在iOS运行失败怎么办

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

canvas.toDataURL在iOS运行失败怎么办

这篇文章将为大家详细讲解有关canvas.toDataURL在iOS运行失败怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近做了一个海报生成的组件,需要drawimage到画布上,image来源包
2023-06-09

sql文件运行失败怎么办

sql 文件运行失败有以下解决方法:检查数据库连接是否正确(用户名、密码、权限)。仔细检查 sql 语句是否有语法错误(引号、分号、关键字)。验证表和字段是否存在,拼写正确,权限足够。确保要插入的数据与表数据类型兼容。检查要插入或更新的值是
sql文件运行失败怎么办
2024-05-30

php7.2运行失败怎么解决

本篇内容主要讲解“php7.2运行失败怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php7.2运行失败怎么解决”吧!php7.2运行失败的解决办法:1、在PHP源码目录下执行“vi M
2023-06-22

打开IE时提示服务器运行失败怎么办

这篇文章主要介绍打开IE时提示服务器运行失败怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、点击桌面左下角的开始菜单,然后在搜索框中输入“文件夹选项”,点击搜索到的文件夹选项。2、打开文件夹选项窗口后,我们点
2023-06-28

云服务器运行安卓模拟器失败怎么办

如果您已经尝试了其他云服务,但仍然无法连接云服务器,那么可能是以下几个原因之一:DNS解析问题:DNS(DomainNameSystem)是互联网上计算机之间进行通信所使用的主机名和IP地址对。如果您的计算机与其他计算机的DNS解析不一致,那么可能会导致连接问题。可以通过在DNS服务中添加正确的DNS服务器来解决这个问
云服务器运行安卓模拟器失败怎么办
2023-10-28

服务器运行失败怎么解决

服务器运行失败可能是由于硬件或系统故障引起的,因此需要检查服务器各部分的情况,具体包括:1、检查内存使用情况查看服务器内存的使用情况,如果过度使用,需要优化服务器。2、检查系统文件检查服务器系统核心文件,如存在损坏或缺失可能导致服务器运行失
2023-03-11

怎么解决php56运行pdo失败问题

这篇文章主要讲解了“怎么解决php56运行pdo失败问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决php56运行pdo失败问题”吧!php56运行pdo失败的解决办法:1、修改p
2023-06-20

php更新语句执行失败怎么办

php更新语句执行失败的解决办法:1、打开相应的PHP文件;2、找到“update set name='1231' from xsb where sex= '...'”语句;3、修改更新语句为“update set from xsb name='1231' where sex= '...'”即可。
2023-05-14

Pygame在Ubuntu中安装失败怎么办

Pygame在Ubuntu中安装失败可能有多种原因,以下是一些可能的解决方案:安装依赖:确保你已经安装了所有必要的依赖。你可以使用以下命令来安装这些依赖:sudo apt-get install -y python3-dev libsdl2
Pygame在Ubuntu中安装失败怎么办
2024-10-13

Java程序在运行但接口调用失败怎么解决

如果Java程序在运行时接口调用失败,可以尝试以下几种解决方法:检查网络连接:确保程序可以正常访问接口所在的服务器。可以尝试通过ping命令或其他网络工具测试服务器的可访问性。检查接口地址和参数:确认程序中使用的接口地址和参数是否正确。可以
2023-10-24

windows vc运行库安装失败怎么解决

这篇文章主要讲解了“windows vc运行库安装失败怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“windows vc运行库安装失败怎么解决”吧!解决方法:方法一:1、首先按下键盘
2023-07-01

运行打开云服务器失败是怎么回事

运行打开云服务器失败可能有多种原因,以下是一些可能的原因和解决方法:1. 云服务器配置错误:请确保您所使用的云服务器配置正确,并符合运行所需的要求。2. 网络问题:检查您的网络连接是否正常,确保能够访问云服务提供商的服务器。3. 安全组设置
2023-09-12

Win 10 运行软件报‘MSCOMCTL.OCX‘缺失怎么办

如果在Windows 10上运行软件时报告缺少“MSCOMCTL.OCX”,可以尝试以下方法解决问题:1. 重新注册MSCOMCTL.OCX文件:- 打开命令提示符(管理员权限)。- 输入以下命令并按Enter键运行:regsvr32 MS
2023-09-09

运行打开云服务器失败是怎么回事

运行打开云服务器失败的原因及解决方法网络问题:网络不稳定、防火墙限制、路由器故障。服务器问题:服务器未启动、操作系统故障、硬件故障。配置错误:密钥不匹配、IP地址错误、端口错误。其他原因:维护、资源不足、恶意软件。故障排除步骤:检查网络连接和防火墙。重启服务器和验证密钥。检查IP地址和端口。联系云服务提供商进行技术支持。
运行打开云服务器失败是怎么回事
2024-04-10

视频播放服务器运行失败怎么解决

如果视频播放服务器运行失败,可以尝试以下解决方法:1. 检查服务器端口是否被占用,如果被占用需要修改端口号。2. 检查服务器配置文件是否正确,例如是否正确指定了视频文件路径等。3. 检查服务器程序是否正常运行,可以查看日志文件来查找错误信息
2023-06-11

Win10 10122预览版升级失败卡在18%怎么办?

Windows 10 Build 10122已经开始大规模向Fast Ring内测用户推送,但毕竟是个预览版,出现问题很正常,包括升级的时候失败。有不少用户称,他们在更新到18%左右的时候就走不动了,最终不得不回python滚到旧版本。这个
2023-06-15

云服务器运行安卓模拟器失败怎么解决

检查网络连接当出现安卓模拟器运行失败的情况时,首先需要检查网络连接。可以通过打开控制面板,查看网络连接是否正常,如果网络连接不稳定,可以尝试重新连接网络。如果网络连接正常,可以尝试检查是否有网络资源无法访问,或者是否有防火墙或其他安全软件阻止了云服务器的访问。检查代码有时候,云服务器的运行代码可能会出现问题,导致无法正
云服务器运行安卓模拟器失败怎么解决
2023-10-28

微信小程序运行环境加载失败怎么解决

微信小程序运行环境加载失败可能是由于网络连接问题、服务器故障或者小程序代码问题引起的。要解决这个问题,可以尝试以下方法:检查网络连接:确保手机或电脑的网络连接正常,尝试连接其他网络或者重启路由器。重启微信小程序:尝试退出当前小程序,然后重新
微信小程序运行环境加载失败怎么解决
2024-03-15

云服务器运行安卓模拟器失败怎么回事

检查网络连接:如果您的云服务器连接到互联网,则可能会遇到网络连接问题。确保您的网络连接稳定和可靠,以防止云服务器无法正常运行。检查应用程序:如果您的应用程序依赖于云服务器上的其他应用程序,则需要检查应用程序的设置是否正确。例如,应用程序的权限、文件权限等。检查数据存储:如果您的应用程序需要大量数据存储,则需要检查云服务
云服务器运行安卓模拟器失败怎么回事
2023-10-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录