日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

canvas反向裁剪技巧

發布時間:2023/12/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 canvas反向裁剪技巧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們都知道在canvas 可以通過clip來實現剪裁功能,其步驟一般是先設置要裁剪的區域(路徑),然后通過ctx.clip()的實現裁剪,裁剪之后,后續的繪制只能在裁剪的區域顯示效果,比如如下一段代碼,實現了一個圓形裁剪:

ctx.beginPath(); ctx.arc(100,100,50,0,Math.PI*2); ctx.clip();ctx.rect(0,0,200,200); ctx.fillStyle='red'; ctx.fill();

最終效果如下:

有的時候,我們希望能夠實現反向裁剪,比如上面例子中,我們希望是圓圈外面是裁剪區域,而不是圓圈內部是裁剪區域。這就是標題所說的反向裁剪。效果如下圖所示:

如何實現反向裁剪呢?
筆者通過實踐,發現有以下幾種思路。

使用合成模式globalCompositeOperation

通過設置globalCompositeOperation的值,可以實現類似的反向裁剪的效果。大致思路是:

  • 首先繪制一個圖形(比如圓形),該圖形外部的區域將會是裁剪區域
  • 設置globalCompositeOperation的值為source-out
  • 然后繪制想要繪制的圖形(比如矩形)

示例代碼如下:

ctx.beginPath();ctx.arc(100, 100, 50, 0, Math.PI * 2); ctx.fillStyle = 'red'; ctx.fill();ctx.beginPath(); ctx.globalCompositeOperation = 'source-out'; ctx.rect(0, 0, 200, 200); ctx.fillStyle = 'red'; ctx.fill();

最終效果參考上面的圖形“反向裁剪”。

使用clip + clearRect方法

另外一種思路是使用clip + clearRect方法,大概的思路如下:

  • 首先繪制要繪制的圖形(比如矩形)
  • 然后設置要反向裁剪的圖形的路徑(比如圓形)
  • 然后調用clip ,再調用clearRect方法清除圓形區域的像素。

示例代碼如下:

ctx.beginPath();ctx.rect(0, 0, 200, 200);ctx.fillStyle = 'red';ctx.fill();ctx.beginPath();ctx.arc(100, 100, 50, 0, Math.PI * 2);ctx.clip();ctx.clearRect(0, 0, 200, 200);

最終效果參考上面的圖形“反向裁剪”。

利用非零環繞原則

我們知道非零環繞原則,可以通過調整路徑的方向(順時針和逆時針),來實現挖空的效果,大致思路如下:

  • 首先構建一個大的區域路徑(順時針方向),比如矩形
  • 然后構建一個小的區域路徑(逆時針方向),比如圓形
  • 調用clip裁剪,然后繪制圖形

示例代碼如下:

ctx.beginPath(); ctx.rect(0, 0, 200, 200); //順時針方向 ctx.arc(100, 100, 50, 0, Math.PI * 2, true); // 逆時針方向 ctx.clip();ctx.beginPath(); ctx.rect(0, 0, 200, 200); ctx.fillStyle = 'red'; ctx.fill();

arc方法的最后一個參數可以控制順時針(false)和逆時針(true),而rect方法沒有,可以通過moveTo,lineTo,自己構建逆時針的rect方法,如下代碼所示:

function counterclockwiseRect(ctx, x, y, w, h) {ctx.moveTo(x, y);ctx.lineTo(x, y + h);ctx.lineTo(x + w, y + h);ctx.lineTo(x + w, y);ctx.lineTo(x, y); }

最終效果參考上面的圖形“反向裁剪”。

參考文檔

https://stackoverflow.com/que...
https://stackoverflow.com/que...
http://caibaojian.com/canvas/...(非零環繞原則 )

歡迎關注公眾號“ITman彪叔”。彪叔,擁有10多年開發經驗,現任公司系統架構師、技術總監、技術培訓師、職業規劃師。熟悉Java、JavaScript、Python語言,熟悉數據庫。熟悉java、nodejs應用系統架構,大數據高并發、高可用、分布式架構。在計算機圖形學、WebGL、前端可視化方面有深入研究。對程序員思維能力訓練和培訓、程序員職業規劃有濃厚興趣。

總結

以上是生活随笔為你收集整理的canvas反向裁剪技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。