這篇文章主要介紹了canvas像素點操作之視頻綠幕摳圖的相關資料,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧
本文介紹了canvas像素點操作之視訊綠幕摳圖,分享給大家,具體如下:
##用法:context.putImageData(imgData, x, y, dX, dY, dWidth, dHeight);下面的栗子簡單實現了幾個簡單的濾鏡效果,具體演算法參考的這裡,學過《數位影像處理》的同學應該對此理解更深刻。 demo 該栗子純屬為了演示功能而做,如果只強調效果而不在乎數據的話,用CSS3的filter屬性便能高效又輕鬆地搞定。 部分代碼
import imgUrl from './component/sample.jpg'; export default { data () { return { imgUrl: imgUrl } }, methods: { onOperate1 () { this.ctx.putImageData(this.onCompute1(), 0, 0); }, onOperate2 () { this.ctx.putImageData(this.onCompute2(), 0, 0); }, ... onCancel () { this.reload(); }, onCompute1 () { let data = this.frameData.data; for (let i = 0; i < this.imgDataLength; i += 4) { let r = data[i + 0], g = data[i + 1], b = data[i + 2]; data[i + 0] = 255 - r; data[i + 1] = 255 - g; data[i + 2] = 255 - b; } return this.frameData; }, onCompute2 () { let data = this.frameData.data; for (let i = 0; i < this.imgDataLength; i += 4) { data[i] = Math.abs(data[i + 1] - data[i + 2] + data[i + 1] + data[i]) * data[i] / 256; data[i + 1] = Math.abs(data[i + 2] - data[i + 1] + data[i + 2] + data[i]) * data[i] / 256; data[i + 2] = Math.abs(data[i + 2] - data[i + 1] + data[i + 2] + data[i]) * data[i + 1] / 256; } return this.frameData; }, ... }, mounted () { this.canvas = this.$refs['canvas']; this.ctx = this.canvas.getContext('2d'); this.reload(); } }上週跟同學去了一趟溧陽天目湖的南山竹海,在景區被忽悠拍了一張照片,就是這張-- 然後被朋友圈吐槽摳圖。其實當時就是站在一塊綠幕前拍的:joy: 。 PS中魔法棒工具可以把圖片中一定容差下的相近像素都選中、清空,輕鬆做到一鍵“摳圖”,前提是主體一定要與背景有大的差異,即像素值差值越大,摳圖效果越好。 Canvas同樣可以做到,並且可以處理視訊幀,其中的原理是一樣的 —— 將每個視訊幀中綠幕的像素區塊透明度置0即可。像這樣—demo 部分程式碼
import videoUrl from './component/video.ogv'; import imgUrl from './component/sample.jpg'; const TOLERANCE = 5; export default { data () { return { videoUrl: videoUrl, imgUrl: imgUrl } }, methods: { draw () { if (this.video.paused || this.video.ended) { return; } this.ctx.drawImage(this.video, 0, 0, this.width, this.height); this.ctx.putImageData(this.cutOut(), 0, 0); }, cutOut () { let frameData = this.ctx.getImageData(0, 0, this.width, this.height), len = frameData.data.length / 4; for (let i = 0; i < len; i++) { let r = frameData.data[i * 4 + 0], g = frameData.data[i * 4 + 1], b = frameData.data[i * 4 + 2]; if (r - 100 >= TOLERANCE && g - 100 >= TOLERANCE && b - 43 <= TOLERANCE) { frameData.data[i * 4 + 3] = 0; } } return frameData; } }, mounted () { this.video = this.$refs['video']; this.canvas = this.$refs['canvas']; this.ctx = this.canvas.getContext('2d'); this.timer = null; this.video.addEventListener('play', () => { this.width = this.video.videoWidth; this.height = this.video.videoHeight; this.timer && clearInterval(this.timer); this.timer = setInterval(() => { this.draw(); }, 50); }, false); } }
參考資料
Manipulating video using canvas
Pixel manipulation with canvasCanvas and images and pixels
總結:以上就是這篇文章的全部內容,希望能對大家的學習有幫助。更多相關教學請造訪
Html5影片教學 ##### #HTML5線上手冊######以上是canvas像素點操作影片綠幕摳圖的詳細內容。更多資訊請關注PHP中文網其他相關文章!