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、前端可視化方面有深入研究。對程序員思維能力訓練和培訓、程序員職業規劃有濃厚興趣。
ITman彪叔公眾號

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449457.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449457.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

set 和select 的區別

簡單賦值是沒有區別的 轉載于:https://www.cnblogs.com/bingyizhihun/p/10597908.html

postgres大版本升級

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。進行升級版本之前請一定做好備份!查看當前版本:[postgresnode1 ~]$ psqlpsql (9.4.4)Type "help" for h…

馬上有錢:揭密25種成為有錢人的方法(圖)

1、做你真正感興趣的事—你會花很多時間在上面,因此你一定要感興趣才行,如果不是這樣的話,你不愿意把時間花在上面,就得不到成功。 2、自己當老板。為別人打工,你絕不會變成巨富,老板一心一意地縮減開支&a…

無人承運平臺系統流程圖

轉載于:https://www.cnblogs.com/procedureMonkey/p/10598052.html

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

Centos7.5 啟動tomcat報錯 報錯: Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program原因:沒有安裝java 解決方法:安裝java yum install java -y轉載于:https://www.cnblogs…

讓自己變成一個上進的人

1.認真設計你的環境2.引入外部監督 求“綁架”3.獲取不確定的反饋4.選擇一條既細密,又永無止境的職業上升臺階。轉載于:https://www.cnblogs.com/Julietma/p/10600241.html

年買筆記本的8個小技巧 最適合自己才最好(組圖)

顯然,智能手機和平板在一定程度上可以替代傳統電腦,讓我們可以隨時隨地上網、使用各種應用。不過,傳統電腦也擁有它的不可替代性,比如移動辦公、視頻編輯、玩游戲,筆記本電腦可能是個更好的選擇。 作為一種成熟的電腦…

MySql查詢系統時間,SQLServer查詢系統時間,Oracle查詢系統時間

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 MySQL查詢系統時間 第一種方法:select current_date; MySQL> select current_date as Systemtime; 第二…

flask同源策略解決辦法及flask-cors只允許特定域名跨域

falsk 同源策略解決辦法: 使用 flask-cors 包 并且 在代碼里 加響應的一行代碼解決。 from flask import Flask, session from flask_cors import CORSapp Flask(__name__) CORS(app, resources{r"/*": {"origins": "*"}}) # 允許…

基本變量和引用變量

基本數據類型作比較,值相等則相等,值不相等則不相等(忽略數據類型) 引用類型作比較,引用地址相等則相等,否則都是不等的。 基本數據類型,和引用數據類型作比較,是比較值是否相等&…

真格量化-持倉量第n檔賣方主力跟隨策略

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np import pandas as pd #日線級別 #開始時間,用于初始化一些參數 def OnStart(context):print("I\m starting...")#設定一個全局變量品種,本策略交易50E…

賺大錢必備 怎樣成為賺錢高手(圖)

1、一旦有賺錢的念頭就馬上一步一個腳印去做,要付諸行動,敢于碰,善于磨,只有這樣才能抓住機會。 2、想賺錢,就要立志當商人,而且目標要高,選定十萬、二十萬,再是一百萬、五百萬。 …

不定長圖片驗證碼訓練

基于LSTM和CTCLoss訓練不定長圖片驗證碼 Github項目地址:https://github.com/JansonJo/captcha_ocr.git # codingutf-8 """ 將三通道的圖片轉為灰度圖進行訓練 """ import itertools import os import re import random import strin…

[云框架]KONG API Gateway v1.5 -框架說明、快速部署、插件開發

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 當前版本采用KONGv0.12.3 當我們決定對應用進行微服務改造時,應用客戶端如何與微服務交互的問題也隨之而來,畢竟…

真格量化-主力跟買策略

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np import pandas as pd #日線級別 #開始時間,用于初始化一些參數 def OnStart(context):print("I\m starting...")#設定一個全局變量品種,本策略交易50E…

頂級投資者的21條箴言(組圖)

每天你都會聽見五花八門的投資建議,告訴你應該買入還是賣出。如果這讓你感到無所適從,不妨靜下心來,聽聽歷史上最成功的投資者的建議。 我們搜集了21位頂尖大牛的投資箴言,以饗讀者。 1、George Soros:好的投資總是無…

python 游戲 —— 漢諾塔(Hanoita)

一、漢諾塔問題 1. 問題來源 問題源于印度的一個古老傳說,大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓…

Base62x比Base64的編碼速度更快嗎?

現在幾乎所有企事業單位、政府機構、軍工系統等的IT生產系統都會用到Base64編碼,從RSA安全密鑰到管理信息系統登錄入口回跳,目前越來越多的IT系統研發者開始使用 Base62x 替換 Base64. -Base62x 提供了一種無符號輸出的Base64的編碼方案,在許…

對Docker常用命令的整理

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 查看docker版本信息、 #docker version #docker -v #docker info image鏡像操作命令 #docker search image_name //檢索image #docker p…

再說千遍萬遍,都不如這四句話管用,不服不行!

一、健康是最大的利益    人有時候,真不知要謀求什么?往往把最值得維護和珍貴的東西忽視了,卻不知揀了芝麻丟了西瓜。   現在好多人都在透支健康,燃燒生命,經常借口工作忙、應酬多,不注意生活方式&…