【vue】【wPaint】html2canvas模糊,wPaint转写模糊,坐标偏移,滚动失效,图片加载失败,添加马赛克

浅浅的花香味﹌ 2022-04-25 07:08 392阅读 0赞

上一篇我们讲到html2canvas,dom转图片,并对图片进行记号笔操作
这一篇我们说一下转写相关的问题:

  • 转写模糊
  • 图片加载失败
  • 记号笔坐标偏移
  • 滚动失效
  • 改个马赛克

存在两次转写,模糊的原因可能就有两个

  • html2canvas转模糊
  • wPaint转模糊

html2canvas转模糊

解决办法:

  • 获取设备像素比并设置canvas的宽高以及canvas.style的宽高

    let imgDom = $(“#html2canvas”);
    let width = imgDom.width();//dom宽
    let height = imgDom.height();//dom高
    // 获取像素比
    const scaleBy = window.devicePixelRatio
    let canvas = document.createElement(‘canvas’);
    canvas.width = width scaleBy;//canvas宽度
    canvas.height = height
    scaleBy;//canvas高度
    canvas.style.width = ${width}px;
    canvas.style.height = ${width}px;
    canvas.getContext(“2d”).scale(scaleBy, scaleBy);

    html2canvas(imgDom[0],{

    1. useCORS:true, // 解决图片跨域
    2. canvas:canvas,
    3. }).then(function(canvas) {
    4. this.img = canvas.toDataURL()

    })

出现的问题

图片在移动端无法显示,在PC端正常显示

引起的原因

因为移动端图片跨域导致的

解决办法

官方文档给出了解决方案:http://html2canvas.hertzen.com/configuration
在这里插入图片描述

  1. useCORS:true,

wPaint转模糊

解决办法:

  • 存储html2canvas转写的图片宽高
  • wPaint初始化时赋值上存储的宽高

    html2canvas(imgDom[0],{

    1. useCORS:true, // 允许图片跨域
    2. canvas:canvas,
    3. }).then(function(canvas) {
    4. // 赋值图片宽高
    5. this.img = canvas.toDataURL()
    6. this.width = canvas.width
    7. this.height = canvas.height

    })
    // 初始化图片宽高与原图保持一致
    let _this = this
    $(“#wPaint”).wPaint({

    1. image: this.img,
    2. width: this.width,
    3. height: this.height,

    })

出现的问题(重要)

这里图片不会模糊,但是记号笔绘制的坐标会出现偏移

引起的原因

原先我们设置的#wPaint的宽高与她绘制的canvas的宽高是一致的,但是现在我们将canvas的宽高设置成了原图的宽高,导致wPaint的宽高(屏幕)比canvas的宽高不一致,所以当绘制的时候记录的坐标点与canvas的坐标点不同
在这里插入图片描述

解决办法:

  • 在wPaint.js中_callShapeFunc方法中设置坐标的缩放比例
  • 这里使用的是宽度的缩放比例对应点击的坐标点,是因为实际情况,我们的图并不是正好与wPaint宽高等比,如下图所示
    在这里插入图片描述

修改代码

  1. let scalee = _this.width / $('#wPaint').width()
  2. // update offsets here since we are detecting mouseup on $(document) not on the canvas
  3. e.pageX = scalee * Math.floor(e.pageX - canvasOffset.left);
  4. e.pageY = scalee * Math.floor(e.pageY - canvasOffset.top);

遇到的其他问题

我们需求是在不使用记号笔的时候,图片可以正常滚动,但是wPaint转写之后,图片不能正常滚动了

引起的原因

wPaint.js中在创建了canvas之后绑定了bindMobileEvents事件,这个事件在wPaint.utils.js中 event.preventDefault();因此导致不能滚动

  1. case 'touchmove':
  2. type = 'mousemove';
  3. // event.preventDefault();
  4. break;

解决办法:

  • 注释掉event.preventDefault()就可以了,如果需要不滚动可以在你自己的页面重新配置

添加马赛克

  • 我把wPaint的line改了
  • 绘制两个方形组合

    // 划线修改成马赛克 start
    _drawLineDown: function(a) {

    1. this.ctx.fillStyle = randomGrey() // 随机颜色
    2. this.ctx.fillRect(a.pageX-8,a.pageY-10,16,10) // 绘制的方形
    3. this.ctx.fillStyle = randomGrey()
    4. this.ctx.fillRect(a.pageX-8,a.pageY,16,10)

    },
    _drawLineMove: function(a) {

    1. this.ctx.lineCap = "square",
    2. this.ctx.fillStyle = randomGrey()
    3. this.ctx.fillRect(a.pageX-8,a.pageY-10,16,10)
    4. this.ctx.fillStyle = randomGrey()
    5. this.ctx.fillRect(a.pageX-8,a.pageY,16,10)

    },
    _drawLineUp: function(a) {

    1. this.ctx.closePath(),
    2. this._addUndo()

    },
    function randomGrey(){

    1. //十六进制颜色随机
    2. var r = Math.floor(Math.random()*256);
    3. var g = r;
    4. var b = r;
    5. var color = '#'+r.toString(16)+g.toString(16)+b.toString(16);
    6. return color;

    }

效果

在这里插入图片描述

总结

这一块总是遇到问题,有时候都觉得不可能是那个原因导致的,所以不去尝试,比如图片跨域的问题,我觉得不会跨域,所以我一直没有去这样改,后来直到实在解决不了了,兔子说试一下,结果就好了,很多时候,遇到问题多尝试把,然后,多读文档跨域的问题文档也有说明,但是我还是搞了很久,关于模糊的问题,主要解决的是兔子,附上的图也是出自他手,我只是一个搬运工。

发表评论

表情:
评论列表 (有 0 条评论,392人围观)

还没有评论,来说两句吧...

相关阅读

    相关 小程序实现图片模糊

    小程序实现图片模糊预加载 导语 最近在做的小程序项目设计大量图片的展示,小程序已经提供了图片的懒加载功能,但是由于图片本身比较大加上要展示的图片比较多,如何以一个比较友好...