关于canvas.todataurl 在ios运行失败的问题解决-kb88凯时官网登录

时间:2020-09-16
阅读:
免费资源网,https://freexyz.cn/

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

关于canvas.todataurl 在ios运行失败的问题解决

上面加载了两张本地图片,两张异地图片,写了一些文字;在windows谷歌浏览器跑是好的,是吧,图片画出来,感觉无压力;用安卓也是好的,很开心;可是到ios手机上,我去,怎么图片显示不出来啊,然后
try catch 错误,没啥有用的信息;

try {
 // 将canvas对象转化为image/png
   var dataurl = canvas.todata
 } 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的解释:

里面讲了画布的污染和解决方法,就是设置 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.todata );
}
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;
}
免费资源网,https://freexyz.cn/
返回顶部
顶部
网站地图