색 변경

<canvas class="canvas" width="300" height="360"></canvas>
<script>
const canvas = document.querySelector(".canvas");
const ctx = canvas.getContext("2d");
const img = new Image();
img.src = "./images/g.jpg";
let original, len;
img.onload = () => {
ctx.drawImage(img, 0, 0);
original = ctx.getImageData(0, 0, 300, 360);
len = original.data.length / 4;
};
canvas.addEventListener('mouseenter',()=>{
const copy = ctx.getImageData(0, 0, 300, 360);
for (let i = 0; i < len; i++) copy.data[i * 4 + 2] = 255;
ctx.putImageData(copy, 0, 0);
})
canvas.addEventListener('mouseleave',()=>{
ctx.putImageData(original, 0, 0);
})
</script>
천천히 색 변경

<canvas class="canvas" width="300" height="360"></canvas>
<script>
const canvas = document.querySelector(".canvas");
const ctx = canvas.getContext("2d");
const img = new Image();
img.src = "./images/g.jpg";
let original, len;
let progress = 0;
let target = 0;
img.onload = () => {
ctx.drawImage(img, 0, 0);
original = ctx.getImageData(0, 0, 300, 360);
len = original.data.length / 4;
render();
};
function render() {
progress += (target - progress) * 0.02;
const copy = ctx.getImageData(0, 0, 300, 360);
for (let i = 0; i < len; i++){
const b = original.data[i * 4 + 2]
copy.data[i * 4 + 2] = b + (255 - b) * progress;
}
ctx.putImageData(copy, 0, 0);
requestAnimationFrame(render);
}
canvas.addEventListener('mouseenter', () => {
target = 1;
})
canvas.addEventListener('mouseleave', () => {
target = 0;
})
</script>
노이즈 효과

<canvas class="canvas" width="300" height="360"></canvas>
<script>
const canvas = document.querySelector(".canvas");
const ctx = canvas.getContext("2d");
const img = new Image();
img.src = "./images/g.jpg";
let original, len;
let target = 0;
let progress = 0;
let jitterAmount = 500;
img.onload = () => {
ctx.drawImage(img, 0, 0);
original = ctx.getImageData(0, 0, 300, 360);
len = original.data.length / 4;
render();
};
function render() {
progress += (target - progress) * 0.02;
const copy = ctx.getImageData(0, 0, 300, 360);
for (let i = 0; i < len; i++) {
const r = original.data[i * 4 + 0];
const g = original.data[i * 4 + 1];
const b = original.data[i * 4 + 2];
const jitterAmount = 500;
const jitter = Math.random() * jitterAmount - (jitterAmount / 2);
const noise = Math.random() * 50 - 25;
copy.data[i * 4 + 0] = r + noise * progress;
copy.data[i * 4 + 1] = g + noise * progress;
copy.data[i * 4 + 2] = b + noise * progress;
copy.data[i * 4 + 0] += jitter * progress;
copy.data[i * 4 + 1] += jitter * progress;
copy.data[i * 4 + 2] += jitter * progress;
}
ctx.putImageData(copy, 0, 0);
requestAnimationFrame(render);
}
canvas.addEventListener('mouseenter', () => {
target = 1;
});
canvas.addEventListener('mouseleave', () => {
target = 0;
});
</script>
