JavaScript 结合 Canvas 可以实现丰富的图片特效。以下是一些基础概念、优势、类型、应用场景以及常见问题及其解决方法。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Canvas Blur Effect</title>
<style>
canvas {
border: 1px solid black;
}
</style>
</head>
<body>
<canvas id="myCanvas" width="500" height="500"></canvas>
<script>
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
// 加载图片
const img = new Image();
img.src = 'path_to_your_image.jpg';
img.onload = () => {
ctx.drawImage(img, 0, 0);
applyBlur(5); // 应用模糊效果,参数为模糊半径
};
function applyBlur(radius) {
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const data = imageData.data;
const kernel = createGaussianKernel(radius);
for (let y = 0; y < canvas.height; y++) {
for (let x = 0; x < canvas.width; x++) {
let r = 0, g = 0, b = 0;
let weightSum = 0;
for (let ky = -radius; ky <= radius; ky++) {
for (let kx = -radius; kx <= radius; kx++) {
const ix = x + kx;
const iy = y + ky;
if (ix >= 0 && ix < canvas.width && iy >= 0 && iy < canvas.height) {
const i = (iy * canvas.width + ix) * 4;
const weight = kernel[(ky + radius) * (2 * radius + 1) + (kx + radius)];
r += data[i] * weight;
g += data[i + 1] * weight;
b += data[i + 2] * weight;
weightSum += weight;
}
}
}
const i = (y * canvas.width + x) * 4;
data[i] = r / weightSum;
data[i + 1] = g / weightSum;
data[i + 2] = b / weightSum;
}
}
ctx.putImageData(imageData, 0, 0);
}
function createGaussianKernel(radius) {
const size = 2 * radius + 1;
const kernel = new Array(size * size);
const sigma = radius / 3;
let sum = 0;
for (let y = -radius; y <= radius; y++) {
for (let x = -radius; x <= radius; x++) {
const g = gaussian(x, y, sigma);
kernel[(y + radius) * size + (x + radius)] = g;
sum += g;
}
}
for (let i = 0; i < kernel.length; i++) {
kernel[i] /= sum;
}
return kernel;
}
function gaussian(x, y, sigma) {
return Math.exp(-(x * x + y * y) / (2 * sigma * sigma)) / (2 * Math.PI * sigma * sigma);
}
</script>
</body>
</html>
requestAnimationFrame
来优化动画帧率,减少不必要的重绘。通过以上方法,可以在网页上实现各种复杂的图片特效,同时确保良好的用户体验和性能表现。
领取专属 10元无门槛券
手把手带您无忧上云