当前位置:首页 > JavaScript

js实现图片特效

2026-04-07 08:42:53JavaScript

图片滤镜效果

使用Canvas的getImageDataputImageDataAPI修改像素值实现基础滤镜:

const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.drawImage(imgElement, 0, 0);
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const data = imageData.data;

// 灰度效果
for (let i = 0; i < data.length; i += 4) {
  const avg = (data[i] + data[i+1] + data[i+2]) / 3;
  data[i] = data[i+1] = data[i+2] = avg;
}
ctx.putImageData(imageData, 0, 0);

动态粒子化效果

通过将图片分解为随机运动的粒子:

js实现图片特效

class Particle {
  constructor(x, y, color) {
    this.x = Math.random() * canvas.width;
    this.y = Math.random() * canvas.height;
    this.targetX = x;
    this.targetY = y;
    this.color = color;
  }
  update() {
    this.x += (this.targetX - this.x) * 0.1;
    this.y += (this.targetY - this.y) * 0.1;
  }
}

// 从图片数据创建粒子阵列
const particles = [];
for (let y = 0; y < imageData.height; y += 5) {
  for (let x = 0; x < imageData.width; x += 5) {
    const index = (y * imageData.width + x) * 4;
    particles.push(new Particle(
      x, y, 
      `rgba(${data[index]}, ${data[index+1]}, ${data[index+2]}, ${data[index+3]})`
    ));
  }
}

function animate() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  particles.forEach(p => {
    p.update();
    ctx.fillStyle = p.color;
    ctx.fillRect(p.x, p.y, 3, 3);
  });
  requestAnimationFrame(animate);
}

3D翻转过渡

使用CSS 3D变换实现立体翻转效果:

js实现图片特效

.flip-container {
  perspective: 1000px;
}
.flipper {
  transition: transform 0.8s;
  transform-style: preserve-3d;
}
.flipper.flipped {
  transform: rotateY(180deg);
}
.front, .back {
  backface-visibility: hidden;
  position: absolute;
}
.back {
  transform: rotateY(180deg);
}

图片拖拽变形

通过监听鼠标事件实现橡皮筋拉伸效果:

let isDragging = false;
let startX, startY;

canvas.addEventListener('mousedown', (e) => {
  isDragging = true;
  [startX, startY] = [e.offsetX, e.offsetY];
});

canvas.addEventListener('mousemove', (e) => {
  if (!isDragging) return;
  ctx.globalCompositeOperation = 'source-over';
  ctx.lineWidth = 5;
  ctx.beginPath();
  ctx.moveTo(startX, startY);
  ctx.lineTo(e.offsetX, e.offsetY);
  ctx.stroke();
  [startX, startY] = [e.offsetX, e.offsetY];
});

WebGL高级特效

使用GLSL着色器实现波浪扭曲:

const shaderScript = `
  precision mediump float;
  uniform sampler2D texture;
  uniform float time;
  varying vec2 vUV;

  void main() {
    vec2 uv = vUV;
    uv.x += sin(uv.y * 10.0 + time) * 0.05;
    gl_FragColor = texture2D(texture, uv);
  }
`;

// 初始化WebGL程序后传递时间变量
function render() {
  gl.uniform1f(timeUniform, performance.now() / 1000);
  gl.drawArrays(gl.TRIANGLES, 0, 6);
  requestAnimationFrame(render);
}

标签: 特效图片
分享给朋友:

相关文章

h5实现图片压缩

h5实现图片压缩

使用Canvas API压缩图片 HTML5的Canvas API可以通过调整画布尺寸和图像质量来实现图片压缩。创建一个Canvas元素,将图片绘制到Canvas上,再通过toDataURL或toBl…

vue实现图片滚动

vue实现图片滚动

实现图片滚动的 Vue 组件 使用 Vue 实现图片滚动效果可以通过自定义组件或第三方库完成。以下是两种常见方法: 方法一:使用 CSS 动画和 Vue 动态绑定 通过 Vue 的 v-for 和…

vue实现展示图片

vue实现展示图片

在 Vue 中展示图片的方法 静态图片展示 静态图片通常存放在项目的 public 或 assets 目录下。使用 img 标签直接引用。 <template> <img sr…

vue实现图片组件

vue实现图片组件

Vue 实现图片组件的方法 基础图片组件实现 创建一个基础的图片组件,支持动态传入图片路径和替代文本。在Vue项目中新建一个ImageComponent.vue文件: <template>…

vue图片预览实现

vue图片预览实现

实现图片预览的常见方法 在Vue中实现图片预览功能可以通过多种方式完成,以下是几种常见的方法: 使用第三方库(如viewer.js) 安装viewer.js库: npm install v-vie…

vue实现图片保存

vue实现图片保存

实现图片保存的基本方法 在Vue中实现图片保存功能通常涉及前端操作,可能包括从Canvas生成、直接下载或通过后端接口保存。以下是几种常见实现方式: 使用HTML5的download属性 对于已存在…