最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解canvas.toDataURL()報(bào)錯(cuò)的解決方案全都在這了

  發(fā)布時(shí)間:2020-03-31 16:16:36   作者:小云菜   我要評(píng)論
這篇文章主要介紹了詳解canvas.toDataURL()報(bào)錯(cuò)的解決方案全都在這了,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

報(bào)錯(cuò)詳盡信息

Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.

關(guān)鍵詞

  • canvas.toDataURL()
  • crossOrigin
  • Access-Control-Allow-Origin

前言

最近在做一個(gè)創(chuàng)意類的圖片合成工具,大概齊就是通過拼接自定義的文字和圖片信息生成一張商品圖片類似的功能,項(xiàng)目中用到了fabric.js這個(gè)畫板庫,最后一步在保存圖片的時(shí)候報(bào)上面的一長串錯(cuò)誤,墻內(nèi)墻外搜了一遍,給出的解決方案都不全面,為避免同學(xué)們?cè)俅尾瓤樱谑怯辛舜宋?/p>

正文

我們?cè)赾onvertDOM2Image時(shí),如果DOM內(nèi)存在圖片資源,該資源所在的web-server是不支持跨域的,保存圖片是不會(huì)成功的。

因此在排查問題時(shí),首先要確定

  • web-server是否允許跨域,我們以nginx為例,response-header內(nèi)要存在Access-Control-Allow-Orgin:xxxx(可以是*,安全性要求比較高的可以根據(jù)主域名自定義)
  • 如果是img標(biāo)簽, 是否添加了crossorigin="anonymous", 如果是Image對(duì)象,同樣是否添加了改屬性obj.crossOrigin='anonymous'
  • 如果還不行,這里先不把答案放出來,我們先看看栗子

在接下來的栗子中我們會(huì)用到將Image轉(zhuǎn)換為canvas對(duì)象的方法

function convertImageToCanvas(image) {
// 創(chuàng)建canvas DOM元素,并設(shè)置其寬高和圖片一樣 
let canvas = document.createElement("canvas");
canvas.width = image.width;
canvas.height = image.height;
canvas.getContext("2d").drawImage(image, 0, 0);
// 我們?cè)趯?shí)際的開發(fā)中,需要將抓換后的base64圖片編碼傳輸?shù)胶笈_(tái)圖片服務(wù)器,由server直接存儲(chǔ)或者生成一張圖片;
// 所以會(huì)用到 toDataURL
console.log(canvas.toDataURL('image/jpeg'))
return canvas;
}

栗子1

本地未設(shè)置跨域允許選項(xiàng)crossorigin=anonymous,web-server未設(shè)置跨域允許選項(xiàng)

<div id="d1">
<img style="width: 300px;height: 240px;" src="http://jb51.net/images/cover_thumbnail_3rd.jpg" alt="">
<p>本地未設(shè)置跨域允許選項(xiàng)crossorigin=anonymous,web-server未設(shè)置跨域允許選項(xiàng)</p>
</div>
<button onclick="setCanvas('d1')">canvas保存</button>
function setCanvas(DOMID) {
let img = document.getElementById(DOMID).querySelector('img')
document.body.appendChild(convertImageToCanvas(img))
}

很顯然,報(bào)錯(cuò)

栗子2

本地標(biāo)簽內(nèi)設(shè)置跨域允許選項(xiàng), web-server未設(shè)置跨域允許選項(xiàng)

這次連圖片都出不來,直接報(bào)錯(cuò)

這個(gè)好理解,瀏覽器同源策略限制嘛

Access to image at 'xxxx' (redirected from 'xxxx') from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

栗子3

本地未設(shè)置跨域允許選項(xiàng)crossorigin=anonymous, web-server設(shè)置跨域允許選項(xiàng)

報(bào)錯(cuò),妥妥的。

栗子4

本地標(biāo)簽內(nèi)設(shè)置跨域允許選項(xiàng)crossorigin=anonymous, web-server設(shè)置跨域允許選項(xiàng)

<div id="d4">
<img style="width: 300px;height: 240px;" src="https://img.alicdn.com/tfs/TB1_uT8a5ERMeJjSspiXXbZLFXa-143-59.png" alt="" crossorigin="anonymous">
<p>本地設(shè)置跨域允許選項(xiàng)`crossorigin=anonymous`,`web-server`設(shè)置跨域允許選項(xiàng)</p>
</div>
<button onclick="setCanvas('d4')">canvas保存</button>

居然可以了,但是~如果在代碼內(nèi)設(shè)置跨域呢?

栗子5

function setCanvas(DOMID) {
let img = document.getElementById(DOMID).querySelector('img')

img.crossOrigin= 'anonymous'

document.body.appendChild(convertImageToCanvas(img))
}

報(bào)錯(cuò)

我看官方文檔的意思是必須同步設(shè)置crossOrigin=anonymous,該圖片憑證才會(huì)被信任

This means that CORS is enabled and credentials are sent if the image is fetched from the same origin from which the document was loaded.

否則緩存的圖像數(shù)據(jù)仍然會(huì)被畫布視為有污染的跨源內(nèi)容.

怎么辦?重新取一遍圖片唄,加個(gè)隨機(jī)數(shù),圖片還是那個(gè)圖片,不過加了個(gè)馬甲,瀏覽器就不認(rèn)識(shí)了

栗子6

function setCanvas(DOMID) {
let img = document.getElementById(DOMID).querySelector('img')

img.src =img.src+'?v='+Math.random()
img.crossOrigin= 'anonymous'

img.onload=()=>{
document.body.appendChild(convertImageToCanvas(img))
}
}

binggo, 完美解決

所以我們?cè)陂_發(fā)過程中,新建圖片,更換圖片,還原圖片等功能代碼內(nèi),最好每一次都加個(gè)隨機(jī)數(shù),以保證源都是最新的,不走緩存

多說一點(diǎn)吧,關(guān)于fabric.js的相關(guān)跨域配置見下方

let _fabricConfig = {
// ....
crossOrigin:'anonymous'
};
/* fabric對(duì)象 */
let _fabricObj = new fabric.Canvas(id, _fabricConfig);


// 新建圖片對(duì)象時(shí)
let imgInstance = new fabric.Image.fromURL(url + '?v='+ Math.random(), img => {}, {crossOrigin: 'anonymous'})

// 動(dòng)態(tài)更新圖片時(shí)
let currentActive = _fabricInstance.getActiveObj();
currentActive.setSrc(randomURL, img =>{}, {crossOrigin: 'anonymous'})

github:http://github.com/phillyx

到此這篇關(guān)于詳解canvas.toDataURL()報(bào)錯(cuò)的解決方案全都在這了的文章就介紹到這了,更多相關(guān)canvas.toDataURL()報(bào)錯(cuò)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!

相關(guān)文章

  • canvas.toDataURL image/png 報(bào)錯(cuò)處理方法推薦

    下面小編就為大家?guī)硪黄猚anvas.toDataURL('image/png')報(bào)錯(cuò)處理方法推薦。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過來看看吧
    2016-05-12
  • 關(guān)于canvas.toDataURL 在iOS運(yùn)行失敗的問題解決

    這篇文章主要介紹了關(guān)于canvas.toDataURL 在iOS運(yùn)行失敗的問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著
    2020-09-16

最新評(píng)論

忻州市| 福泉市| 阜平县| 赫章县| 海晏县| 秀山| 体育| 南开区| 乌恰县| 吴旗县| 房产| 宜君县| 扎囊县| 宁陕县| 广西| 日喀则市| 喀喇| 九龙城区| 凯里市| 桐乡市| 曲松县| 绩溪县| 延寿县| 阿尔山市| 正宁县| 广州市| 临城县| 义马市| 台东市| 井冈山市| 都匀市| 天津市| 明溪县| 错那县| 怀来县| 衡山县| 甘肃省| 屏东市| 大安市| 商河县| 内黄县|