video
è¦ç´ ã®æ©è½ã canvas
ã¨çµã¿åããããã¨ã§ããªã¢ã«ã¿ã¤ã ã«åç»ãã¼ã¿ãæä½ãã表示ä¸ã®åç»ã«ãã¾ãã¾ãªè¦è¦å¹æãåãå
¥ãããã¨ãã§ãã¾ãããã®ãã¥ã¼ããªã¢ã«ã§ã¯ãJavaScript ã³ã¼ãã§ã¯ãããã¼å¦çï¼ãã°ãªã¼ã³ç»é¢å¹æãã¨ãå¼ã°ããï¼ãè¡ãæ¹æ³ã示ãã¾ãã
ãã®ã³ã³ãã³ããã¬ã³ããªã³ã°ããããã«ä½¿ç¨ãã HTML ææ¸ã¯ä¸è¨ã®éãã§ãã
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>åç»ãã¹ããã¼ã¸</title>
<style>
body {
background: black;
color: #cccccc;
}
#c2 {
background-image: url(media/foo.png);
background-repeat: no-repeat;
}
div {
float: left;
border: 1px solid #444444;
padding: 10px;
margin: 10px;
background: #3b3b3b;
}
</style>
</head>
<body>
<div>
<video
id="video"
src="media/video.mp4"
controls
crossorigin="anonymous" />
</div>
<div>
<canvas id="c1" width="160" height="96"></canvas>
<canvas id="c2" width="160" height="96"></canvas>
</div>
<script src="processor.js"></script>
</body>
</html>
ããããèªã¿åãã¹ãéè¦ãªãã¤ã³ãã¯ä»¥ä¸ã®éãã§ãã
canvas
è¦ç´ ã c1
㨠c2
ã¨ãã ID ã§ç¢ºç«ãã¦ãã¾ãããã£ã³ãã¹ c1
ã¯å
åç»ã®ç¾å¨ã®ãã¬ã¼ã ã表示ããããã«ä½¿ç¨ãããc2
ã¯ã¯ãããã¼å¹æãè¡ã£ãå¾ã®åç»ã表示ããããã«ä½¿ç¨ããã¾ããc2
ã«ã¯åç»ã®ç·ã®èæ¯ãç½®ãæããããã«ä½¿ç¨ãã鿢ç»ãäºåèªã¿è¾¼ã¿ããã¾ããprocessor.js
ã¨ããååã®ã¹ã¯ãªããããã¤ã³ãã¼ãããã¾ããprocessor.js
ã§ã® JavaScript ã³ã¼ã㯠3 ã¤ã®ã¡ã½ããã§æ§æããã¦ãã¾ãã
doLoad()
ã¡ã½ããã¯ãHTML ææ¸ãæåã«èªã¿è¾¼ã¾ããã¨ãã«å¼ã³åºããã¾ãããã®ã¡ã½ããã®ä»äºã¯ãã¯ãããã¼å¦çã³ã¼ãã«å¿
è¦ãªå¤æ°ãæºåãããã¨ã¨ãã¦ã¼ã¶ã¼ãåç»ã®åçãå§ãããã¨ãæ¤åºã§ããããã«ã¤ãã³ããªã¹ãã¼ãè¨å®ãããã¨ã§ãã
const processor = {};
processor.doLoad = function doLoad() {
const video = document.getElementById("video");
this.video = video;
this.c1 = document.getElementById("c1");
this.ctx1 = this.c1.getContext("2d");
this.c2 = document.getElementById("c2");
this.ctx2 = this.c2.getContext("2d");
video.addEventListener(
"play",
() => {
this.width = video.videoWidth / 2;
this.height = video.videoHeight / 2;
this.timerCallback();
},
false,
);
};
ãã®ã³ã¼ã㯠HTML è¦ç´ ã®ä¸ã§å
·ä½çãªæ³¨ç®ãã¹ãè¦ç´ ãããªãã¡ video
è¦ç´ 㨠2 ã¤ã® canvas
è¦ç´ ã¸ã®åç
§ãåå¾ãã¾ããã¾ãã2 ã¤ã®ãã£ã³ãã¹ããããã®ã°ã©ãã£ãã¯ã³ã³ããã¹ãã¸ã®åç
§ãåå¾ãã¾ãããããã¯å®éã«ã¯ãããã¼å¹æãè¡ãã¨ãã«ä½¿ç¨ãã¾ãã
次ã«ãaddEventListener()
ãå¼ã³åºãã㦠video
è¦ç´ ã®ç£è¦ãéå§ããã¦ã¼ã¶ã¼ãåç»ã®åçãã¿ã³ãæ¼ããã¨ãã«éç¥ãåãåããããã«ãã¾ããã¦ã¼ã¶ã¼ãåçãéå§ãããã¨ã«å¿çãã¦ããã®ã³ã¼ãã¯åç»ã®å¹
ã¨é«ããåå¾ããããããã®åç»ã®ãµã¤ãºãååã«ãã¾ãï¼ã¯ãããã¼å¹æãå®è¡ããã¨ãã«åç»ã®ãµã¤ãºãååã«ãã¾ãï¼ã次㫠timerCallback()
ã¡ã½ãããå¼ã³åºãã¦ãåç»ã®è¦è´ãéå§ããè¦è¦çãªå¹æãè¨ç®ãã¾ãã
ã¿ã¤ãã¼ã³ã¼ã«ããã¯ã¯ãåç»ã®åçéå§æï¼"play "ã¤ãã³ããçºçããæï¼ã«æåã«å¼ã³åºããããã®å¾ãããããã®ãã¬ã¼ã ã«ãã¼ã¤ã³ã°å¹æãéå§ããããã«å®æçã«å¼ã³åºãããããã«ç¢ºç«ããå½¹å²ãæ ãã¾ãã
processor.timerCallback = function timerCallback() {
if (this.video.paused || this.video.ended) {
return;
}
this.computeFrame();
setTimeout(() => {
this.timerCallback();
}, 0);
};
ã³ã¼ã«ããã¯ãæåã«è¡ããã¨ã¯ãåç»ãåçããã¦ãããã©ããã調ã¹ããã¨ã§ããããåçããã¦ããªããã°ãã³ã¼ã«ããã¯ã¯ä½ããã®å¦çãè¡ããã«ããã«è¿ãã¾ãã
次㫠computeFrame()
ã¡ã½ãããå¼ã³åºããç¾å¨ã®åç»ãã¬ã¼ã ã«å¯¾ãã¦ã¯ãããã¼å¹æãå®è¡ãã¾ãã
ã³ã¼ã«ããã¯ãæå¾ã«è¡ããã¨ã¯ãsetTimeout()
ãå¼ã³åºãã¦ãå¯è½ãªéãæ©ãå度å¼ã³åºãããããã«ã¹ã±ã¸ã¥ã¼ãªã³ã°ãããã¨ã§ããç¾å®ã®ä¸çã§ã¯ãããããåç»ã®ãã¬ã¼ã ã¬ã¼ãã®ç¥èã«åºã¥ãã¦ããã®å¦çãè¡ãããããã«ã¹ã±ã¸ã¥ã¼ãªã³ã°ããã§ãããã
ä¸è¨ã®éããcomputeFrame()
ã¡ã½ããã¯ãå®éã«ãã¼ã¿ã®ãã¬ã¼ã ãåå¾ããã¯ãããã¼å¹æãé©ç¨ãã¾ãã
processor.computeFrame = function () {
this.ctx1.drawImage(this.video, 0, 0, this.width, this.height);
const frame = this.ctx1.getImageData(0, 0, this.width, this.height);
const data = frame.data;
for (let i = 0; i < data.length; i += 4) {
const red = data[i + 0];
const green = data[i + 1];
const blue = data[i + 2];
if (green > 100 && red > 100 && blue < 43) {
data[i + 3] = 0;
}
}
this.ctx2.putImageData(frame, 0, 0);
};
ãã®ã«ã¼ãã³ãå¼ã³åºãããã¨ããvideo è¦ç´ ã¯ææ°ã®åç»ãã¼ã¿ã®ãã¬ã¼ã ã表示ãã¦ãã¾ãã
ãã®åç»ã®ãã¬ã¼ã ã¯æåã®ãã£ã³ãã¹ã®ã°ã©ãã£ãã¯ã³ã³ããã¹ã ctx1
ã«ã³ãã¼ãããé«ãã¨å¹
ã«ã¯ååä¿åãããã¬ã¼ã ãååã®ãµã¤ãºã§æç»ããå¤ãæå®ãã¾ããvideo è¦ç´ ãã³ã³ããã¹ãã® drawImage()
ã¡ã½ããã«æ¸¡ãã¨ãç¾å¨ã®åç»ãã¬ã¼ã ãã³ã³ããã¹ãã«æç»ãããã¨ãã§ãããã¨ã«æ³¨æãã¦ãã ãããçµæã¯æ¬¡ã®ããã«ãªãã¾ãã
æåã®ã³ã³ããã¹ãã§ getImageData()
ã¡ã½ãããå¼ã³åºãã¨ãåç»ã®ç¾å¨ã®ãã¬ã¼ã ã®çã®ã°ã©ãã£ãã¯ãã¼ã¿ã®ã³ãã¼ãåå¾ãã¾ããããã«ãããæä½å¯è½ãªçã® 32 ããããã¯ã»ã«ç»åãã¼ã¿ãæä¾ããã¾ããæ¬¡ã«ããã¬ã¼ã ã®ç»åãã¼ã¿ã®åè¨ãµã¤ãºã 4 ã§å²ã£ã¦ãç»åã®ãã¯ã»ã«æ°ãè¨ç®ãã¾ãã
for
ã«ã¼ãã¯ãã¬ã¼ã ã®ãã¯ã»ã«ãæ¾ããåãã¯ã»ã«ã®èµ¤ãç·ãéã®å¤ãåãåºãããã®å¤ã foo.png
ããã¤ã³ãã¼ããããéæ¢èæ¯ç»åã«ç½®ãæããç·ç»é¢ãæ¤åºããããã«ä½¿ç¨ããæå®ã®æ°å¤ã¨æ¯è¼ãã¾ãã
ãã¬ã¼ã ã®ç»åãã¼ã¿ã®ä¸ã§ãã°ãªã¼ã³ç»é¢ã®ä¸é¨ã¨ã¿ãªããã弿°ã®ä¸ã«å¾ããããã¹ã¦ã®ãã¯ã»ã«ã¯ãã¢ã«ãã¡å¤ã 0 ã«ç½®ãæãããããã®ãã¯ã»ã«ãå®å
¨ã«éæã§ãããã¨ã示ãã¾ãããã®çµæãæçµçãªç»åã¯ã°ãªã¼ã³ã¹ã¯ãªã¼ã³ã®é åå
¨ä½ã 100% éæã«ãªããctx2.putImageData
ã使ç¨ãã¦åºåå
ã®ã³ã³ããã¹ãã«æç»ããã¨ãéçãªèæ¯ã®ä¸ã«ãªã¼ãã¼ã¬ã¤ãããç»åã«ãªãã¾ãã
åºæ¥ä¸ãã£ãç»åã¯ãã®ããã«ãªãã¾ãã
ããã¯åç»ã®åçã¨åæã«ç¹°ãè¿ãè¡ãããæ¬¡ããæ¬¡ã¸ã¨ãã¬ã¼ã ãå¦çãããã¯ãããã¼å¹æã§è¡¨ç¤ºããã¾ãã
ãã®ä¾ã®å ¨ã½ã¼ã¹ãè¦ã.
é¢é£æ å ±RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4