2011-03-11 43 views
1

我有一個畫布,背景中有一個大圖像,前面有一個較小的圓形圖像。我實現了這一輪的圖像效果,通過使用夾子,像這樣HTML Canvas剪輯和putImageData

ctx.save(); 

ctx.beginPath(); 
ctx.arc(x,y,r,0,Math.PI*2, true); 
ctx.closePath(); 
ctx.clip(); 

ctx.drawImage(img,x-r,y-r,2*r,2*r);  // draw the image 
ctx.restore(); 

然後我要旋轉的圓形圖像,所以我使用的第二上下文,旋轉和重繪像這樣

backCanvas=document.createElement('canvas');  
backContext=backCanvas.getContext('2d'); 
backCanvas.width=w; 
backCanvas.height=h; 

backContext.translate(w/2,h/2); 
backContext.rotate(a); 

backContext.drawImage(img,-w/2,-h/2,w,h); 

var imgData=backContext.getImageData(0,0,w,h); 

ctx.save(); 

ctx.beginPath(); 
ctx.arc(x,y,r,0,Math.PI*2, true); 
ctx.closePath(); 
ctx.clip(); 
ctx.putImageData(imgData,x,y); 

ctx.restore(); 

但是,什麼情況是從背面畫布複製黑色透明背景並且剪輯無法「剪輯」它。

任何幫助,將理解

+0

只是FYI,如果您正在繪製到畫布的圖像是在不同的域上,您將不被允許調用getImageData。 – 2011-03-11 13:29:40

+0

是的,你是絕對正確的。我遇到了這個問題,並通過發佈< - 允許文件訪問從文件> – puk 2011-03-11 21:10:07

回答

5

按照specs

電流路徑,變換矩陣,陰影屬性,全局α,剪輯區域,和全球複合算不得影響getImageData()和putImageData()方法。

就你而言,你爲什麼要使用額外的畫布和像素數據操作?爲什麼不只是

ctx.save(); 

ctx.beginPath(); 
ctx.arc(x, y, r, 0, Math.PI*2, true); 
ctx.closePath(); 
ctx.clip(); 

ctx.translate(x, y); 
ctx.drawImage(img, -r, -r, 2*r, 2*r); 
// not restoring context here, saving the clipping region and translation matrix 

// ... here goes the second part, wherever it is: 
ctx.save(); 
ctx.rotate(a); 
ctx.drawImage(img, -r, -r, 2*r, 2*r); 
ctx.restore(); 
+0

來解決這個問題。抱歉,我仍然對剪輯和轉換的概念不熟悉。我會試一試 – puk 2011-03-15 05:06:18

+0

它的工作!謝謝。但是我不得不在最後添加一個ctx.restore()來使其工作 – puk 2011-03-15 05:28:18