Maison > interface Web > Voir.js > Comment créer des effets de peinture à l'huile réalistes à l'aide de Vue et Canvas

Comment créer des effets de peinture à l'huile réalistes à l'aide de Vue et Canvas

王林
Libérer: 2023-07-18 22:53:48
original
1579 Les gens l'ont consulté

Comment créer des effets de peinture à l'huile réalistes à l'aide de Vue et Canvas

Introduction :
Les peintures à l'huile sont célèbres pour leurs textures riches et leurs effets délicats. De nos jours, grâce aux puissantes fonctions de Vue et Canvas, nous pouvons simuler les effets réalistes des peintures à l'huile grâce à la programmation. Cet article vous expliquera comment utiliser Vue et Canvas pour créer des effets de peinture à l'huile réalistes et joindra des exemples de code correspondants.

1. Préparation
Tout d'abord, nous devons introduire l'élément Canvas dans le projet Vue. Ajoutez une balise canvas au modèle dans le composant Vue et attribuez-lui un identifiant unique, par exemple :

<template>
  <canvas id="oil-painting-canvas"></canvas>
</template>
Copier après la connexion

Ensuite, récupérez l'élément canvas dans la propriété calculée du composant Vue pour les opérations ultérieures :

computed: {
  canvasElement() {
    return document.getElementById('oil-painting-canvas')
  }
}
Copier après la connexion

En même temps, Nous devons connaître le contexte du dessin :

computed: {
  canvasContext() {
    return this.canvasElement.getContext('2d')
  }
}
Copier après la connexion

2. Dessinez l'image de base
Avant de commencer à créer l'effet de peinture à l'huile, nous devons dessiner une image de base sur la toile comme couche inférieure. Cela peut être n’importe quelle image. Dans la fonction hook de cycle de vie Mounted() du composant Vue, dessinez l'image sur le Canvas : mounted()中,将图片绘制到Canvas上:

mounted() {
  const image = new Image()
  image.src = require('@/assets/base-image.jpg')
  image.onload = () => {
    this.canvasContext.drawImage(image, 0, 0)
  }
}
Copier après la connexion

这样,我们就在Canvas上成功绘制了一张基础图像。

三、创建油画效果
接下来,我们将为Canvas添加油画效果。在Vue组件的计算属性中,定义一个方法来模拟油画的效果:

computed: {
  oilPaintingEffect() {
    const imageData = this.canvasContext.getImageData(0, 0, this.canvasElement.width, this.canvasElement.height)
    const data = imageData.data

    for (let i = 0; i < data.length; i += 4) {
      const r = data[i]
      const g = data[i + 1]
      const b = data[i + 2]

      const gray = 0.2989 * r + 0.587 * g + 0.114 * b // 将像素点转化为灰度值

      data[i] = data[i + 1] = data[i + 2] = gray // 将RGB值设置为灰度值,使图片变成黑白色调
    }

    this.canvasContext.putImageData(imageData, 0, 0)
  }
}
Copier après la connexion

在上述代码中,我们使用了getImageData()方法获得Canvas上每个像素的数据,然后将RGB值的平均值作为灰度值,将像素点转换为黑白色调,模拟油画的效果。最后,通过putImageData()方法将处理后的图像数据重新绘制到Canvas上。

四、添加交互性
我们可以通过添加交互性,使用户能够与油画效果进行互动。在Vue组件的方法中,添加鼠标事件监听器来实现交互效果:

methods: {
  handleMousemove(event) {
    const x = event.offsetX
    const y = event.offsetY

    const imageData = this.canvasContext.getImageData(0, 0, this.canvasElement.width, this.canvasElement.height)
    const data = imageData.data

    for (let i = 0; i < data.length; i += 4) {
      const distance = Math.sqrt((x - i / 4 % this.canvasElement.width) ** 2 + (y - Math.floor(i / 4 / this.canvasElement.width)) ** 2)
      const opacity = Math.max(0, 0.8 - distance / 100) // 控制透明度,距离鼠标越远,透明度越低

      data[i + 3] = opacity * 255 // 将透明度应用到像素点上
    }

    this.canvasContext.putImageData(imageData, 0, 0)
  }
}
Copier après la connexion

在此代码中,我们监听鼠标的移动事件,并计算鼠标的坐标。通过计算鼠标相对于像素点的距离,控制透明度的变化,从而实现油画效果的交互性。

五、事件绑定
为了让上述的交互效果生效,我们需要将鼠标事件绑定到Canvas元素上。在Vue组件的模板中,将handleMousemove

<template>
  <canvas id="oil-painting-canvas" @mousemove="handleMousemove"></canvas>
</template>
Copier après la connexion
De cette façon, nous avons réussi à dessiner une image de base sur le Canvas.


3. Créer un effet de peinture à l'huile

Ensuite, nous ajouterons un effet de peinture à l'huile à la toile. Dans les propriétés calculées du composant Vue, définissez une méthode pour simuler l'effet de la peinture à l'huile : 🎜rrreee🎜Dans le code ci-dessus, nous utilisons la méthode getImageData() pour obtenir les données de chaque pixel sur la Toile, puis La moyenne des valeurs RVB est utilisée comme valeur d'échelle de gris pour convertir les pixels en tons noir et blanc, simulant l'effet d'une peinture à l'huile. Enfin, les données d'image traitées sont redessinées sur le canevas via la méthode putImageData(). 🎜🎜4. Ajouter de l'interactivité🎜Nous pouvons permettre aux utilisateurs d'interagir avec l'effet de peinture à l'huile en ajoutant de l'interactivité. Dans la méthode du composant Vue, ajoutez un écouteur d'événement de souris pour obtenir des effets interactifs : 🎜rrreee🎜Dans ce code, nous écoutons l'événement de mouvement de la souris et calculons les coordonnées de la souris. En calculant la distance de la souris par rapport aux pixels, les changements de transparence sont contrôlés pour obtenir l'interactivité de l'effet peinture à l'huile. 🎜🎜5. Liaison d'événement🎜Pour que l'effet interactif ci-dessus prenne effet, nous devons lier l'événement de la souris à l'élément Canvas. Dans le modèle du composant Vue, liez la méthode handleMousemove à l'événement mousemove de Canvas : 🎜rrreee🎜Conclusion : 🎜En combinant Vue et Canvas, nous pouvons utiliser du code pour simuler l'effet réaliste de la peinture à l'huile , et atteindre l'interactivité. Cet article vous montre comment créer des effets de peinture à l'huile réalistes dans un projet Vue, avec des exemples de code correspondants. J'espère que cet article vous aidera ! 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal