图片上马赛克

上代码

<template>
	<el-carousel

​    id="elCarousel"

    :*interval*="2000"*arrow*="always"*indicator-position*="none"*height*="100%"

   \><el-carousel-item :*name*="'item' + index" *v-for*="(item, index) in picture" :*key*="index"><canvas *v-MosaicCanvas*="index" *class*="MosaicCanvas" /></el-carousel-item>

   </el-carousel>
</template>
<script>
  import Mosaic from 'image-mosaic'
  export default {
        data() {
            return {
              picture: [],
              canvasWidth: '',
              canvasHeight: ''
            }
 		 },
        directives: {
            MosaicCanvas: {
              //不是轮播图 可以直接拿到数据渲染

              //因为是轮播图  不确定元素个数 所以得给每个canvas手动加马赛克

              //如果是拿到数据 直接转 渲染不出来 因为后面有方法是异步的  会白屏 看不到效果
              inserted: function (el, binding, vnode) {
                //这里的el就是canvas ,binding.value 就是轮播图的第几个
                vnode.context.setMosaicImg(el, binding.value || 0)
              }
            }
      	},
        mounted() {
            this.init()
            //拿到父盒子的宽高  让canvas 拉满
            const elCarousel = document.getElementById('elCarousel')
            this.canvasWidth = elCarousel.clientWidth
            this.canvasHeight = elCarousel.clientHeight
     	 },
        methods: {
             init() {
                //请求接口拿到图片列表
             	this.picture = data
  			 },
            //加马赛克
            setMosaicImg(el, index) {
              const src = this.picture[index]
              this.drawImageToCanvas(el, src).then(ctx => {
                const mosaic = new Mosaic(ctx)
                const MouseEvents = {
                  init() {
                    //马赛克在canvas上的位置

                    //Y轴方向起点
                    const ctxY1 = Number.parseInt(ctx.canvas.clientHeight * 0.33)

                    //Y轴方向终点
                    const ctxY2 = Number.parseInt(ctx.canvas.clientHeight * 0.66)

                    //X轴全部都马塞克
                    const ctxW = Number.parseInt(ctx.canvas.clientWidth)

                    //隔20个像素打个马赛克
                    for (let i = ctxY1; i + 20 <= ctxY2; i = i + 20) {
                      for (let j = 0; j + 20 <= ctxW; j = j + 20) {
                        console.log(j, i, ctxW)
                        mosaic.drawTileByPoint(j, i)
                      }
                    }
                  }
                }
                MouseEvents.init()
              })
            },
            drawImageToCanvas(el, src) {
              return new Promise(reslove => {
                const canvas = el
                const ctx = canvas.getContext('2d')
                const image = new Image()
                // 解决跨域问题
                image.setAttribute('crossOrigin', 'anonymous')
                const _this = this
                image.onload = function () {
                  //拿到父盒子的宽高 填满父盒子
                  //不这样做 即使canvas设置100% 渲染区域还是之前的图片大小
                  canvas.width = _this.canvasWidth
                  canvas.height = _this.canvasHeight
                  ctx.drawImage(this, 0, 0, _this.canvasWidth, _this.canvasHeight)
                  const quality = 1
                  // 这里的dataurl就是base64类型
                  // 使用toDataUrl将图片转换成jpeg的格式,不要把图片压缩成png,因为压缩成png后base64的字符串可能比不转换前的长!
                  const dataurl = canvas.toDataURL('image/jpeg', quality)
                  reslove(ctx)
                }
                image.src = src
              })
            }
        }
  }
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
去掉图片上的马赛克是一种对图像进行编辑和修改的技术。以下是一个简要的步骤来去掉图片上的马赛克: 1. 选择合适的图像编辑软件。一些常用的软件包括Adobe Photoshop、GIMP和Pixlr等。确保您熟悉和掌握所选软件的基本功能和工具。 2. 打开需要去除马赛克图片。在您的软件中打开图像文件,并导入需要编辑的图像。 3. 放大图像以更好地显示马赛克区域。使用软件的放大工具(通常是放大镜)来查看并聚焦在需要去掉马赛克的区域,以便更准确地进行编辑。 4. 使用吸管工具获取一个通常被认为是无马赛克区域的样本。将吸管放在某个无马赛克区域上,单击以选取并复制颜色和纹理信息。 5. 使用修复工具或画笔工具修复马赛克区域。选择合适的修复工具或画笔工具,并将其调整为与背景匹配的合适大小和硬度。然后,将其应用于马赛克区域,以覆盖或修复马赛克纹理。 6. 反复进行编辑直到马赛克完全消除。根据马赛克的复杂程度和图像的细节,您可能需要多次使用修复工具或画笔工具来反复编辑和修复马赛克区域,直到达到满意的结果。 7. 完成编辑后,保存并导出图像。选择所需的文件格式和保存的位置,并保存编辑后的图像。 需要注意的是,马赛克通常是为了图像保护和隐私而添加的。在编辑图像以去除马赛克之前,请确保您有所有必要的许可和法律权益。此外,去掉马赛克可能会改变原始图像的内容和外观,因此请慎重考虑和判断是否进行该项操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值