iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
0
Modern Web

菜雞用Canvas/Pixi動動動動動起來系列 第 9

【Day09】Canvas-合成效果&裁剪路徑

  • 分享至 

  • xImage
  •  

合成效果

之前的範例可以看到後來畫的圖形如果位置重複就會覆蓋在前面畫出的圖形上,而canvas也有globalCompositeOperation這個屬性處理這種覆蓋的部分

globalCompositeOperation = type

以下範例 舊圖形:粉紅矩形 | 新圖形:藍色圓形

type | 描述 | 預覽圖
------------- | -------------
source-over | 預設值。將新圖形畫在舊圖形上 | https://ithelp.ithome.com.tw/upload/images/20200918/20111500pSlncUHyzo.png
source-in | 只保留新、舊圖形重疊處,其餘變為透明 | https://ithelp.ithome.com.tw/upload/images/20200918/20111500ghqQkQLPjV.png
source-out | 只保留新、舊圖形非重疊的新圖形處,其餘變為透明 | https://ithelp.ithome.com.tw/upload/images/20200918/20111500h0Z2QDPgO2.png
source-atop | 舊圖形保留,新圖形只畫在新舊圖形重疊處,且在舊圖形之上 | https://ithelp.ithome.com.tw/upload/images/20200918/20111500w7gF4w9WsP.png
destination-over | 將新圖形畫在舊圖形之下 | https://ithelp.ithome.com.tw/upload/images/20200918/20111500vfFcda9de0.png
destination-in | 只保留新、舊圖形重疊處,且舊圖形在新圖形之上,其餘變為透明 | https://ithelp.ithome.com.tw/upload/images/20200918/20111500inFRoDyv0r.png
destination-out | 只保留新、舊圖形非重疊的舊圖形處,其餘變為透明 | https://ithelp.ithome.com.tw/upload/images/20200918/20111500Sox1NQ44so.png
destination-atop | 新圖形保留,舊圖形只畫在新舊圖形重疊處,且在新圖形之上 | https://ithelp.ithome.com.tw/upload/images/20200918/2011150017MVWQEB3e.png
lighter | 新、舊圖形重疊處變為新舊圖形兩圖形的色碼相加的顏色 | https://ithelp.ithome.com.tw/upload/images/20200918/20111500dt91zQ8DQh.png
xor | 新、舊圖形重疊處變為透明 | https://ithelp.ithome.com.tw/upload/images/20200918/20111500dt91zQ8DQh.png
copy | 只保留新圖形,舊圖形移除 | https://ithelp.ithome.com.tw/upload/images/20200918/20111500C8EZo809K5.png

裁剪路徑

裁剪路徑其實在【Day04】Canvas-繪製圖形(2)有提到,會在這裡提出是因為他的效果跟合成效果裡的source-insource-atop很相似,但最大差異在於裁剪路徑不需要再加入新圖形,消失部分也不會出現在畫布上(source-in是變透明)。

方法 描述
clip() 轉換目前繪圖路徑為裁剪路徑

canvas畫布預設有一個等同於本身大小的裁減路徑,等同於無裁剪效果。

注意:這裡自己寫過才發現,clip()這個遮罩,只有效在之後繪製的圖像,如果是在clip()前繪製的則無法有遮罩效果

小小範例

codepen範例連結

//將畫布繪畫區域進行三角形遮罩
  ctx.beginPath()
  ctx.moveTo(150,40)
  ctx.lineTo(250,225)
  ctx.lineTo(50,225)
  ctx.clip()
        
  //繪畫粉紅色矩形
  ctx.fillStyle="#F98585"
  ctx.fillRect(0,0,200,250)
        
  //繪畫藍色圓形
  ctx.fillStyle="#2A98F2"
  ctx.beginPath()
  ctx.arc(200,200,100,0,2*Math.PI,true)
  ctx.fill()
遮罩前 遮罩後
https://ithelp.ithome.com.tw/upload/images/20200918/20111500hcDrP8mx2T.png https://ithelp.ithome.com.tw/upload/images/20200918/201115000oMbZ7SnRf.png

~如有疑問或是錯誤,歡迎不吝指教~

參考來源
[1]https://developer.mozilla.org/zh-TW/docs/Web/API/Canvas_API/Tutorial/Compositing
[2]https://www.w3school.com.cn/tags/html_ref_canvas.asp
[3]https://www.runoob.com/w3cnote/html5-canvas-intro.html


上一篇
【Day08】Canvas-變形效果
下一篇
【Day10】Canvas-自己做個"小畫家"
系列文
菜雞用Canvas/Pixi動動動動動起來30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言