佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > 使用canvas對多圖片拼合并導(dǎo)出圖片的方法

使用canvas對多圖片拼合并導(dǎo)出圖片的方法

熱門標(biāo)簽:智能手機(jī) 檢查注冊表項(xiàng) 美圖手機(jī) 使用U盤裝系統(tǒng) 網(wǎng)站建設(shè) 阿里云 百度競價(jià)點(diǎn)擊價(jià)格的計(jì)算公式 硅谷的囚徒呼叫中心

先說下canvas繪圖的基本方法,如下:

const myCanvas = document.createElement('canvas');
    myCanvas.width = 400;
    myCanvas.height = 400;
const ctx = myCanvas.getContext('2d');
const img = new Image();
img.src = "1.jpg";
//當(dāng)圖片加載完畢的時候在drawImage,否則可能圖片還沒有加載完畢
img.onload=()=>{
    ctx.drawImage(img, 0, 0, 100, 50);
}

語法:

drawImage(image, x, y)

以canvas上指定的坐標(biāo)點(diǎn)開始,按照圖像的原始尺寸大小繪制整個圖像。

drawImage(image, x, y, width, height)

以canvas上指定的坐標(biāo)點(diǎn)開始,以指定的大小(width和height)繪制整個圖像,圖像會自動縮放。

drawImage(image, imageX, imageY, imageWidth, imageHeight, x, y, width, height)

將指定圖像的局部圖像(以(imageX, imageY)為左上角、寬度為imageWidth、高度為imageHeight的矩形部分)繪制到canvas中以( x, y)為左上角坐標(biāo)、寬度為width、高度為height的矩形區(qū)域中

這次多圖拼合的業(yè)務(wù)場景是做不同內(nèi)容的定制分享圖片,用到的圖片元素有,背景圖片、外鏈圖片、網(wǎng)站logo、定制生產(chǎn)的二維碼圖,需要解決的問題,都是在畫布轉(zhuǎn)圖片輸出時產(chǎn)出的。主要有3點(diǎn):

1、圖片的跨域問題;
2、繪制多圖,造成的畫布污染;
3、圖片的大小;

首先圖片的跨域問題,這個問題在網(wǎng)上已經(jīng)有很多相關(guān)信息,解決辦法如下:

img.setAttribute('crossOrigin', 'anonymous');

當(dāng)解決完跨域問題后,在多圖拼合導(dǎo)出后,出現(xiàn)了新的報(bào)錯信息:

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

我發(fā)現(xiàn)這個問題時,查看網(wǎng)上的資料,大多也是用上面的跨域方法解決的,可是我明顯在我的業(yè)務(wù)場景里是不管用的。

通過對代碼的排查,我發(fā)現(xiàn),背景圖+二維碼圖時,并不會報(bào)這個錯誤,如外鏈圖片做了跨域處理,單獨(dú)使用時,也不會報(bào)錯。而logo圖片都是本地的文件,顯然不應(yīng)該是跨域問題。

那么二維碼圖和背景圖能夠不出錯的原因,應(yīng)該在于二維碼圖片源是base64格式的。

于是,我試著將logo圖使用畫布導(dǎo)出base64格式,然后和背景圖+二維碼圖進(jìn)行拼合,導(dǎo)出時果然沒再報(bào)錯。

所有解決多圖拼合導(dǎo)出時,Tainted Canvases的問題,應(yīng)該是將圖片元素做成base64的格式,就能夠避免了。

因?yàn)槲业臉I(yè)務(wù)場景中有外鏈圖片,而且不是所有的外鏈都對我網(wǎng)站域名做了跨域允許的處理,所以,在生成外鏈圖片的base64數(shù)據(jù)時,可是使用img.onerror事件的處理,用缺省圖替換。

因?yàn)橛性诋嬁倛D之前,有對多圖的分別處理,因此,使用Promise處理可能會更好一些。

在圖片導(dǎo)出的大小問題上,導(dǎo)出時盡量使用

myCanvas.toDataURL('image/jpeg', encoderOptions)

encoderOptions:可以從0到1的區(qū)間內(nèi)選擇圖片的質(zhì)量。如果超出取值范圍,將會使用默認(rèn)值 0.92。其他參數(shù)會被忽略。

以上個人對canvas拼合多圖并導(dǎo)出圖片的經(jīng)驗(yàn)總結(jié)。 希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:黃山 懷化 湘潭 通遼 賀州 山南 煙臺 湖北

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《使用canvas對多圖片拼合并導(dǎo)出圖片的方法》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    苍山县| 湖州市| 图木舒克市| 冷水江市| 韩城市| 景泰县| 江油市| 禹城市| 辛集市| 兴宁市| 尤溪县| 临高县| 宣化县| 墨脱县| 云浮市| 南漳县| 武隆县| 邯郸县| 潮州市| 余庆县| 聂荣县| 蓝田县| 贵定县| 荥经县| 郁南县| 安康市| 新野县| 吴江市| 牙克石市| 离岛区| 黔西| 古丈县| 盖州市| 密云县| 电白县| 安吉县| 永顺县| 旅游| 沂源县| 新化县| 南部县|