婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 關于canvas.toDataURL 在iOS運行失敗的問題解決

關于canvas.toDataURL 在iOS運行失敗的問題解決

熱門標簽:只辦理400電話 如何獲取地圖標注客戶 平涼地圖標注位置怎么弄 高德地圖標注地點糾錯 南昌仁和怎么申請開通400電話 電話機器人電銷系統掙話費 電話機器人黑斑馬免費 拓展地圖標注 機器人外呼系統存在哪些能力

最近做了一個海報生成的組件,需要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
先上我的代碼:

<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')
    },
    /**
     * 加載圖片
     * @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.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()
      })
    },
    /**
     * 繪制文字
     * @param {String} title  文字名稱
     * @param {Number} x  x軸坐標
     * @param {Number} y  y軸坐標
     * @param {Number} maxwidth  最大寬度
     * @param {String} color  顏色
     * @param {String} font  字體樣式
     * @param {String} textalign  文字排版
     */
    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.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

 /**
     * 加載圖片
     * @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.toDataURL 在iOS運行失敗的問題解決》,本文關鍵詞  關于,canvas.toDataURL,在,iOS,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《關于canvas.toDataURL 在iOS運行失敗的問題解決》相關的同類信息!
  • 本頁收集關于關于canvas.toDataURL 在iOS運行失敗的問題解決的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲制服丝袜在线| 5566中文字幕一区二区电影| 99视频超级精品| 精品播放一区二区| 蜜臀a∨国产成人精品| 69久久99精品久久久久婷婷| 亚洲精品高清在线观看| 91亚洲精品久久久蜜桃网站 | 麻豆精品蜜桃视频网站| 欧美亚洲一区二区在线| 亚洲免费视频中文字幕| 色欧美乱欧美15图片| 亚洲综合一区二区精品导航| 欧美老年两性高潮| 久久精品噜噜噜成人88aⅴ| 久久欧美一区二区| 91日韩精品一区| 日一区二区三区| 国产日产欧美精品一区二区三区| 成人动漫视频在线| 香蕉成人啪国产精品视频综合网 | 91在线国产福利| 亚洲二区在线视频| 26uuu国产在线精品一区二区| 丁香啪啪综合成人亚洲小说| 伊人夜夜躁av伊人久久| 日韩美女天天操| 91成人免费在线视频| 国产一区亚洲一区| 午夜伦欧美伦电影理论片| 久久毛片高清国产| 欧美三级视频在线观看| 东方aⅴ免费观看久久av| 亚洲一区在线观看免费| 欧美成人欧美edvon| 日本高清免费不卡视频| 韩国一区二区在线观看| 亚洲电影一级黄| 亚洲欧洲av一区二区三区久久| 日韩免费成人网| 欧美日韩精品一区二区| aaa亚洲精品| 粉嫩av亚洲一区二区图片| 奇米精品一区二区三区在线观看 | 久久综合九色综合97婷婷| 欧美性猛交xxxx乱大交退制版| 成熟亚洲日本毛茸茸凸凹| 国产精品18久久久| 亚洲免费在线视频| 欧美国产欧美综合| 国产调教视频一区| 日韩精品在线看片z| 91精品国产综合久久久久| 亚洲愉拍自拍另类高清精品| 欧美日韩国产首页| 日韩国产欧美视频| 一区二区国产视频| 日韩一区二区在线观看视频| 国产精品12区| 国产欧美一区视频| 日韩免费观看2025年上映的电影 | 激情欧美日韩一区二区| 日韩美女视频19| 日韩一区二区三| 欧美日韩综合色| 99在线精品观看| 色婷婷亚洲一区二区三区| 99精品久久只有精品| 国产乱码精品一区二区三区忘忧草| 五月婷婷色综合| 国产一区二区三区在线看麻豆| 国产一区二区三区精品视频| 国内精品伊人久久久久av影院 | 欧美综合视频在线观看| 国产无人区一区二区三区| 久久er精品视频| 亚洲免费伊人电影| 亚洲福利一二三区| 成人动漫视频在线| 国产高清成人在线| 91搞黄在线观看| 成人激情动漫在线观看| av一区二区三区在线| 91蜜桃网址入口| 欧美色图12p| 91精品国产福利在线观看| 日韩一区二区电影| 久久久久九九视频| 久久九九影视网| 国产精品美女视频| 久久99国产精品尤物| 成人av电影免费观看| 日本福利一区二区| 国产色产综合色产在线视频| 精品国产不卡一区二区三区| 国产欧美一区二区在线观看| 欧美aaaaa成人免费观看视频| 国产激情视频一区二区在线观看| 色天使色偷偷av一区二区| 欧美一级生活片| 亚洲电影你懂得| 欧美综合天天夜夜久久| 亚洲精品久久久久久国产精华液| 成+人+亚洲+综合天堂| 欧美性一二三区| 亚洲最大成人网4388xx| www.亚洲色图.com| 国产夜色精品一区二区av| 久久国产精品99精品国产| 51精品视频一区二区三区| 午夜亚洲国产au精品一区二区 | 国产成人av资源| 大白屁股一区二区视频| 亚洲色图都市小说| 丝袜亚洲另类丝袜在线| 欧美日韩卡一卡二| 天天爽夜夜爽夜夜爽精品视频| 日韩欧美国产一区在线观看| 欧美激情一区三区| 国产露脸91国语对白| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 欧美日韩在线不卡| 亚洲国产成人午夜在线一区| 日本人妖一区二区| 豆国产96在线|亚洲| 欧美电影免费观看高清完整版在线| 亚洲精品欧美激情| 成av人片一区二区| 精品捆绑美女sm三区| 亚洲一区在线观看视频| 粉嫩嫩av羞羞动漫久久久| 欧美一区二区三区四区久久| 香蕉久久一区二区不卡无毒影院| 99精品久久99久久久久| 久久人人爽爽爽人久久久| 婷婷成人激情在线网| 欧美在线影院一区二区| 亚洲激情图片一区| 一本色道综合亚洲| 亚洲综合无码一区二区| 欧美日韩一级视频| 日本中文字幕一区二区有限公司| 精品视频一区 二区 三区| 亚洲高清中文字幕| 欧美日韩国产在线观看| 男人的天堂久久精品| 日韩精品在线看片z| 国产黄色精品网站| 中文字幕在线不卡| 色就色 综合激情| 午夜精品免费在线观看| 日韩亚洲欧美成人一区| 国产精品白丝av| 日韩美女视频一区二区| 欧美日韩一区二区三区不卡| 美腿丝袜一区二区三区| 欧美国产综合一区二区| 欧洲一区二区av| 极品美女销魂一区二区三区免费 | 中文字幕一区二区不卡 | 国产剧情一区二区三区| 国产精品视频在线看| 不卡一区中文字幕| 亚洲成人免费观看| 精品国产sm最大网站免费看| 国产成人在线影院| 中文一区二区完整视频在线观看| 99久久国产综合精品色伊| 亚洲精品免费播放| 精品成人一区二区| 欧美伦理影视网| 韩国精品免费视频| 最新国产成人在线观看| 日韩女优电影在线观看| 成人国产精品免费观看| 午夜av电影一区| 中文字幕亚洲一区二区av在线 | 色综合网站在线| 久久99国产精品久久99果冻传媒| 免费欧美在线视频| 久久久国产一区二区三区四区小说| 日本韩国精品一区二区在线观看| 麻豆精品在线视频| 亚洲精品成a人| 久久久亚洲精品一区二区三区| 欧美色中文字幕| 91在线播放网址| 国产伦精品一区二区三区在线观看 | 国产精品亚洲а∨天堂免在线| 亚洲老妇xxxxxx| 国产女人18水真多18精品一级做| 555www色欧美视频| 欧美日韩中文一区| 不卡一区二区中文字幕| 国产91丝袜在线观看| 青娱乐精品视频| 视频一区二区三区中文字幕| 中文成人av在线| 久久久久九九视频| 91精品福利在线一区二区三区|