μΊλ²μ€λ κΈ°λ³Έμ μΌλ‘ ν½μ λ¨μλ‘ μ‘°μμ΄ κ°λ₯νλ°, λΉλμ€λ λ§μ°¬κ°μ§λ‘ κ·Έλν½μ μΌλ‘ μ‘°μ κ°λ₯
( ex. ) λΉλμ€ ν½μ λ¨μλ‘ μͺΌκ°μ λ€μκ±°λ.. λ±μ΄λ―Έμ§ λμ μ λΉλμ€λ₯Ό κ·Έλ¦° κ±°λ€!! λκ°λ€
κ²°κ΅ μΊλ²μ€λ
κ·Έλ¦¬κ³ λ€ μ§μ°κ³
κ·Έλ¦¬κ³ λ λ€μ μ§μ°κ³
μ¬μ μ€λΉ λλ©΄ ν! μ¬μνλ
html λΉλμ€ νκ·Έλ μ¨κΈ°κΈ°
video {
position: absolute;
width: 0;
height: 0;
}
const canvas = document.querySelector('.canvas');
const ctx = canvas.getContext('2d');
let canPlayState = false;
ctx.textAlign = 'center';
ctx.fillText('λΉλμ€ λ‘λ© μ€..', 300, 200);
const videoElem = document.querySelector('.video');
videoElem.addEventListener('canplaythrough', render);
function render() {
ctx.drawImage(videoElem, 0, 0, 600, 400);
requestAnimationFrame(render);
}
λΉλμ€μ νμ¬ μ¬μμκ°
for (let i = 0; i < messages.length; i++) {
if (videoElem.currentTime > messages[i].time) {
ctx.fillText(messages[i].message, messages[i].x, messages[i].y);
}
}
const canvas = document.querySelector('.canvas');
const ctx = canvas.getContext('2d');
ctx.font = 'bold 50px serif';
ctx.fillStyle = 'red';
const videoElem = document.querySelector('.video');
videoElem.addEventListener('canplaythrough', render);
const messages = [
{ time: 1, message: '1 γ
γ
', x: 100, y: 100 },
{ time: 3, message: '2 γ
γ
', x: 300, y: 300 },
{ time: 5, message: '3 γ
γ
', x: 400, y: 200 },
];
function render() {
console.log(videoElem.currentTime);
ctx.drawImage(videoElem, 0, 0, 600, 400);
for (let i = 0; i < messages.length; i++) {
if (videoElem.currentTime > messages[i].time) {
ctx.fillText(messages[i].message, messages[i].x, messages[i].y);
}
}
requestAnimationFrame(render);
}
μν!! ν½μ λ¨μ μμ μΆμΆμ μ΄λ κ² νλ©΄ λλꡬλ
보μ΄μλκ°! 무ν λ λλ§!! λ§ μ΄κ² λΉλμ€λ€
κ²°κ΅ μΊλ²μ€λ
κ·Έλ¦¬κ³ λ€ μ§μ°κ³
κ·Έλ¦¬κ³ λ λ€μ μ§μ°κ³
console.log(imageData.data);
// ..γ
...λ¨Έλ
Έ λ°°μ΄μμ 9λ§ 6μ²κ°
w: 600
,h: 400
,rgba
λΌ 4κ°
=> 24λ§ ν½μ * 4
rgba
μ μνμ±λ(a
)λ λ€ λ§₯μλ©μ΄λκΉ i * 4
λ νμ 255
console.log(imageData.data[0]);
// μν!!
κ° i * 4
ν κ²λ€μ λ€ κ°κ° r,g,b μμλ€μ λ§₯μλ©μΌλ‘ λμ΄μ¬λ €μ£Όλ κ²!
μ¦, λ²νΌμ λλ₯΄λ©΄ colorValue
κ°μ΄ λ°λλλ‘ μ€μ ν΄μΌ ν¨!!
putImageData(imageData, dx, dy)
putImageData(imageData, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight)
function render() {
ctx.drawImage(videoElem, 0, 0, 600, 400);
imageData = ctx.getImageData(0, 0, 600, 400);
leng = imageData.data.length / 4;
for (let i = 0; i < leng; i++) {
switch (colorValue) {
case 'red':
imageData.data[i * 4 + 0] = 255;
break;
case 'green':
imageData.data[i * 4 + 1] = 255;
break;
case 'blue':
imageData.data[i * 4 + 2] = 255;
break;
}
}
ctx.putImageData(imageData, 0, 0);
requestAnimationFrame(render);
}
λͺ μ¬ν΄!!! μλλ μ»΄ν¨ν°λ€!!
starts from the
0
data-color= "λ«λ«"
κ°μ κ°μ§λ€addEventListener
μ νμ§ μκ³ , λΆλͺ¨ Elm
μΈ div.btns
μ μ΄λ²€νΈ μμ<div class="btns">
<button class="btn" data-color="red">R</button>
<button class="btn" data-color="green">G</button>
<button class="btn" data-color="blue">B</button>
<button class="btn" data-color="">Reset</button>
</div>
const btnsElem = document.querySelector('.btns');
for (let i = 0; i < leng; i++) {
switch (colorValue) {
case 'red':
imageData.data[i * 4 + 0] = 255;
break;
case 'green':
imageData.data[i * 4 + 1] = 255;
break;
case 'blue':
imageData.data[i * 4 + 2] = 255;
break;
}
}
ctx.putImageData(imageData, 0, 0);
requestAnimationFrame(render);
}
btnsElem.addEventListener('click', function (e) {
colorValue = e.target.getAttribute('data-color');
});
1λ¨κ³. ν΄λ¦λ λ²νΌ(μ΄λ²€νΈ μμλ¨!!) μ data-color
μ κ°μ Έμ¨λ€
2λ¨κ³. colorValue
κ°μ λ³κ²½νλ€
3λ¨κ³. render()
λ κ³μ μΌμ΄λκ³ μμΌλ―λ‘, ν΄λ¦μ μλ‘ λ³κ²½λ colorValue
κ°μ λ°λΌ switch
λ¬Έ μλ
4λ¨κ³. ν΄λΉ μμ μμΉ λ§₯μλ©μΌλ‘ μ¬λ €μ£ΌκΈ°
// μμ λ³ν
const canvas = document.querySelector('.canvas');
const ctx = canvas.getContext('2d');
const videoElem = document.querySelector('.video');
videoElem.addEventListener('canplaythrough', render);
const btnsElem = document.querySelector('.btns');
let imageData;
const particles = [];
let particle;
let colorValue;
let leng;
function render() {
ctx.drawImage(videoElem, 0, 0, 600, 400);
imageData = ctx.getImageData(0, 0, 600, 400);
leng = imageData.data.length / 4;
console.log(imageData.data[0]);
for (let i = 0; i < leng; i++) {
switch (colorValue) {
case 'red':
imageData.data[i * 4 + 0] = 255;
break;
case 'green':
imageData.data[i * 4 + 1] = 255;
break;
case 'blue':
imageData.data[i * 4 + 2] = 255;
break;
}
}
ctx.putImageData(imageData, 0, 0);
requestAnimationFrame(render);
}
btnsElem.addEventListener('click', function (e) {
colorValue = e.target.getAttribute('data-color');
});