html5 - canvas有時(shí)候會(huì)拿不到toDataURL數(shù)據(jù)
問(wèn)題描述
問(wèn)題:1.不知道為什么,canvas有時(shí)候會(huì)拿不到繪圖數(shù)據(jù),只拿到了“data:;” 。請(qǐng)問(wèn)我這么寫(xiě)錯(cuò)在哪里。2.我這么寫(xiě)canvas 哪里需要優(yōu)化的沒(méi)有
相關(guān)代碼:
initCanvas:function(opt){ var self=this; var img=new Image(); var ctx,type=opt?2:1; img.setAttribute(’crossOrigin’, ’anonymous’); img.onload=function(){var $img=self._view._cropBlock.find(’img’);var sizes,ratio;var imgW=img.width;//要截取的圖片(引用的圖片)寬度var imgH=img.height;console.log(’img’,imgW,imgH);if(!opt){ sizes=self.getCanvasSize($img); opt={left:0,top:0,width:sizes.width,//畫(huà)布的寬度height:sizes.height//畫(huà)布的高度 }; ratio=Number((opt.width/img.width).toFixed(2));}else{ ratio=Number(($img.width()/img.width).toFixed(2))-0.01;//實(shí)際img元素和圖片實(shí)際比例,四舍五入需減0.01 opt.left=opt.left/ratio;//opt的參數(shù)值是基于實(shí)際img元素的,要獲得基于實(shí)際圖片的值 opt.top=opt.top/ratio; imgW=opt.width/ratio; imgH=opt.height/ratio;}
self.canvas = document.createElement(’canvas’);$.extend(self.canvas,{width:opt.width,height:opt.height});ctx = self.canvas.getContext(’2d’);ctx.save();var width=self.canvas.width||400;var height=self.canvas.height||400;console.log(self.canvas,width,height);ctx.clearRect(0,0,width,height);ctx.drawImage(img,opt.left,opt.top,imgW,imgH,0,0,width,height);ctx.restore();self.getSearchList(self.canvas,{imgUrl:img.src,type:type});self.canvas.remove(); }; img.onerror=function(err){console.log(’canvas error:’+err); }; img.src=this._model.currentImg;},getSearchList:function(canvas,opt,callback){ var self=this; var url=canvas.toDataURL('image/jpeg',0.2); $.extend(opt,{imgUrlBase64:url}); callback=callback|| $.noop; common.services.getRecognizedResultList(opt) .success(function(data){self.searchList=data.results;callback(); });}
問(wèn)題解答
回答1:圖片過(guò)大,調(diào)用canvas.toDataURL有時(shí)候會(huì)失敗的,建議調(diào)用之前先對(duì)圖片做壓縮處理,看看這篇文章能否幫到你文件上傳那些事兒
回答2:我經(jīng)常碰到這樣的事,各種各樣的原因都有,一般都是參數(shù)什么的不對(duì),你看看ctx.drawImage(img,opt.left,opt.top,imgW,imgH,0,0,width,height);這一行的里面的參數(shù)是否都有值(請(qǐng)直接在這一行語(yǔ)句的上面一行打印信息)。沒(méi)報(bào)錯(cuò)你只能自己慢慢打斷點(diǎn)一個(gè)模塊一個(gè)模塊去排除。
相關(guān)文章:
1. HTML5不支持frameset一般怎么解決?2. javascript - Vue的計(jì)算屬性底層依賴原理是怎么樣?3. javascript - jquery怎么給select option一個(gè)點(diǎn)擊時(shí)觸發(fā)的事件,如圖 如果選擇自定義觸發(fā)一個(gè)時(shí)間?4. 網(wǎng)頁(yè)爬蟲(chóng) - python爬蟲(chóng)用BeautifulSoup爬取<s>元素并寫(xiě)入字典,但某些div下沒(méi)有這一元素,導(dǎo)致自動(dòng)寫(xiě)入下一條,如何解決?5. 百度地圖api - Android百度地圖SDK,MapView上層按鈕可見(jiàn)卻不可觸,怎么解決?6. mysql 獲取時(shí)間函數(shù)unix_timestamp 問(wèn)題?7. html5 - canvas中的mousedrag事件,為什么鼠標(biāo)拖出canvas,然后再次移入canvas,drag事件還觸發(fā)8. 新入手layuiadmin,部署到tp中。想用php自已寫(xiě)一個(gè)后臺(tái)管理系統(tǒng)。9. javascript - react 組件 使用super()報(bào)錯(cuò)10. javascript - es6擴(kuò)展運(yùn)算符...的問(wèn)題
