所有分类
  • 所有分类
  • 后端开发
利用 Vue 和 Canvas 创建逼真油画效果的方法与代码示例

利用 Vue 和 Canvas 创建逼真油画效果的方法与代码示例

如今,借助Vue和Canvas的强大功能,我们可以通过编程来模拟油画的逼真效果。在开始创造油画的效果之前,我们需要在Canvas上绘制一张基础图像作为底层。三、创建油画效果通过Vue和Canvas的结合运用,我们可以利用代码来模拟油画的逼真

油画之所以叫做油画,就是因为那画面丰富的质感与效果。而现在,只需要学习如何用Vue和Canvas编程,我们也能制作出这样的视觉体验!下面我会手把手地教你们怎么运用这两样神奇的工具,做出逼真的油画效果,并且还附上实战案例哦~

一、准备工作

首先,咱们要告诉Vue项目什么叫Canvas元素。就在你的Vue组件的模板中放个canvas标签,别忘了给它起个唯一的名字就像这样:

html

首先,咱们要找出Vue组件里的画布部分。然后把它放到计算属性那边儿去,好以后用起来方便嘛~

“`javascript

mounted() {

把我画布的id给找出来,放到这个变量里。

这个就把画布的2D图形处理能力赋给当前对象。

}

同时,我们需要获取绘图上下文:

computed: {

ctx() {

返回这个画布里的”2D”模式。

}

  

二、绘制基础图像

咱得先搞定一下背景图片,就在Canvas上抹个颜色。啥样的图都行。接着,你看Vue组件的mount()那儿,直接把图放在那儿哈:

直接把图片的地址改成你想要的那张,比如 ‘/path/to/your/image.jpg’ 就行了。

img.onload = () => {

就直接在画布上画图!首先要从0,0这个起点开始,然后再根据画布大小调整宽度和高度哈~

computed: {
  canvasElement() {
    return document.getElementById('oil-painting-canvas')
  }
}

};

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

三、创建油画效果

接下来咱们得把Canvas弄得有点像油画了。首先得在Vue组件里的计算属性那儿添加一个让它变得有艺术味儿的小方法~

computed: {
  canvasContext() {
    return this.canvasElement.getContext('2d')
  }
}

methods: {

createOilPaintingEffect() {

了解这个知识点吗?当你上网看图片时,它们实际上是以信息的方式投影在屏幕上。想知道具体怎么实现的话?没错,就是先将屏幕上的图像捕捉下来,然后转化为数字格式后,我们才能看见那些静态图图。这里非常关键的部分就是”捕捉屏幕图像”。所以,imageData就好比是那个把屏幕拍照存下的照片,很关键的哟。

const data = imageData.data;

首先,咱们就从0数起,一直数到找到第4个数的位置。然后,就能拿到接下来连续的4个数~

const r = data[i];

const g = data[i + 1];

const b = data[i + 2];

const gray = (r + g + b) / 3;

data[i] = gray;

data[i + 1] = gray;

data[i + 2] = gray;

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

}

拖图进来就行了,代码就这么简单:this.ctx.putImageData(imageData, 0, 0)。

你就使用那个叫getImageData()的方法,把Canvas画布里每个像素点的颜色信息全给扒拉出来。接着,就计算这些颜色值对应的RGB值的平均数。瞧,这不就是我们想要的黑白灰色调了!这样就能搞定油画般的效果了。最后,别忘了用putImageData()把调整后的图像数据描绘回去,那画面就能焕然一新!

四、添加交互性

来点好玩儿的,给这幅油画添个功能,让大家可以互动!做法很简单,就在Vue组件里,给对应方法加上鼠标的侦听器就成!

利用 Vue 和 Canvas 创建逼真油画效果的方法与代码示例

handleMousemove(event) {

直接把画布的边界框取出来,就用这个rect变量。

x就是用鼠标在长方形上点击时,离左边缘的距离。

y的话,其实就是你手指在屏幕上滑动的距离,再减去小方块顶部的位置就行了。

把电脑屏幕上的画布图片抓下来就这么做:ctx.getImageData(x, y, 1, 1)。记住。

const alpha = data[3];

别忘,把这个值除以255再填给globalAlpha。

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)
  }
}

this.ctx.fillStyle = ‘#000’;

在画布上画个正方形,位置是(x,y),边长都为10。

我们搞了个小软件,你随便动下鼠标,它就能告诉你现在在哪儿,还能告诉你和屏幕每个点有多近或者多远,就跟看地图差不多。然后,按照这个距离调调图片的透明度,就可以看到那种油画感

五、事件绑定

想让鼠标动起来有特效?简单,咱们就把鼠标操作和Canvas元素捆绑在一起,只要在Vue组件中把 handleMousemove 方法搞定与 Canvas 的 mousemove 事件关联上就行了。

听说过用Vue和Canvas搞油画感觉的真实感吗?很酷炫的我们可以做出来而且还能互动,真的太棒了!这篇文章就是教你怎么做到这个,不怕学不会,还附带实例代码哈~

六、优化油画效果

想让油画更逼真?简单得很,咱们搞快点就好!比如说,弄点颜色变换和小花样进去:

把数据的每一位数都加上50乘以随机数(在0和1之间)。

好,咱们在数组的第i+1个位置上卡个灰色,然后再加个0到49里随便选的随机数就成了呗,毕竟对半分可是50,最后的结果就是灰色加上一个数在最前面几位是0到50的随机数

咱们来这么干,就是把最下面那个数字加上这一行的灰度,然后再乘上个随机数。随机数是从0到1之间选出来的,所以每一行都会有独特的颜色变化

咱们就用了点随机数,这样一来,画面上的颜色变化和手感质感都变得更加真实好玩儿!

七、动态调整油画效果

咱们是不是得加点小东西,让大家能随心所欲地调整油画效果呀?像那种调力度的滑块咋样?

咱们在vue组件里的data里面调一下那个Oil Painting Intensity属性呗。

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)
  }
}

data() {

return {

oilPaintingIntensity: 50

接着,就在创建油画效果的方法里用上这个属性就好了:

咱们就给每个gray值和油画强度添点变数,放到data[i]里去。

这个程序就是把grey和oilPaintingIntensity乘上随机数,然后替换掉整个一列的数据~

给data[i + 2]添个灰色然后随机乘以0.5到-0.5的1个区间的dotArt浓度就好。

这样一来,你就可以随心所欲地调节出喜欢的油画质感了!

八、保存油画效果

最后,要添加个新功能让大家能轻松保存自己涂鸦出来的油画效果。很简单,用油画那块布Canvas的数据生成个数据URL地址就行了!

saveOilPainting() {

直接把你那画图的东西保存成dataURL,格式设成’image/png’即可。

这儿有个链接,咱们用这个创建个新的链接标签。

link.href = dataURL;

点下面的下载按钮,文件名叫’oil_painting.png’。

  

link.click();

在Vue组件的模板中,添加一个按钮来触发保存功能:

0

评论0

请先
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?