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

本文详细探讨了在使用html2canvas和wPaint进行dom转图片过程中遇到的模糊、图片加载失败、坐标偏移、滚动失效等问题,并提供了解决方案。对于html2canvas的模糊,解决方案包括调整canvas宽高和处理设备像素比;图片加载失败可能由移动端跨域引起,官方文档提供了相应解决方法。wPaint的模糊主要涉及坐标偏移,通过设置坐标的缩放比例来修正。此外,还解决了滚动失效的问题,通过注释相关代码实现图片正常滚动。最后,介绍了如何为图片添加马赛克效果。
摘要由CSDN通过智能技术生成

上一篇我们讲到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],{
	useCORS:true, // 解决图片跨域
	 canvas:canvas,
	}).then(function(canvas) {
	this.img = canvas.toDataURL()
})
出现的问题

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

引起的原因

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

解决办法

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

  useCORS:true,
wPaint转模糊

解决办法:

  • 存储html2canvas转写的图片宽高
  • wPaint初始化时赋值上存储的宽高
html2canvas(imgDom[0],{
          useCORS:true, // 允许图片跨域
          canvas:canvas,
        }).then(function(canvas) {
     // 赋值图片宽高
	this.img = canvas.toDataURL()
	this.width = canvas.width
	this.height = canvas.height
})
// 初始化图片宽高与原图保持一致
let _this = this
$("#wPaint").wPaint({
	image: this.img,
	width: this.width,
	height: this.height,
})
出现的问题(重要)

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

引起的原因

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

解决办法:
  • 在wPaint.js中_callShapeFunc方法中设置坐标的缩放比例
  • 这里使用的是宽度的缩放比例对应点击的坐标点,是因为实际情况,我们的图并不是正好与wPaint宽高等比,如下图所示
    在这里插入图片描述
修改代码
let scalee = _this.width / $('#wPaint').width() 
// update offsets here since we are detecting mouseup on $(document) not on the canvas
e.pageX = scalee * Math.floor(e.pageX - canvasOffset.left);
e.pageY = scalee * Math.floor(e.pageY - canvasOffset.top);
遇到的其他问题

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

引起的原因

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

case 'touchmove':
type = 'mousemove';
// event.preventDefault();
break;
解决办法:
  • 注释掉event.preventDefault()就可以了,如果需要不滚动可以在你自己的页面重新配置
添加马赛克
  • 我把wPaint的line改了
  • 绘制两个方形组合
// 划线修改成马赛克 start
_drawLineDown: function(a) {
    this.ctx.fillStyle = randomGrey() // 随机颜色
    this.ctx.fillRect(a.pageX-8,a.pageY-10,16,10) // 绘制的方形
    this.ctx.fillStyle = randomGrey()
    this.ctx.fillRect(a.pageX-8,a.pageY,16,10)
},
_drawLineMove: function(a) {
    this.ctx.lineCap = "square",
    this.ctx.fillStyle = randomGrey()
    this.ctx.fillRect(a.pageX-8,a.pageY-10,16,10)
    this.ctx.fillStyle = randomGrey()
    this.ctx.fillRect(a.pageX-8,a.pageY,16,10)
},
_drawLineUp: function(a) {
    this.ctx.closePath(),
    this._addUndo()
},
function randomGrey(){
	//十六进制颜色随机
	var r = Math.floor(Math.random()*256);
	var g = r;
	var b = r;
	var color = '#'+r.toString(16)+g.toString(16)+b.toString(16);
	return color;
}
效果

在这里插入图片描述

总结

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对你的问题,我可以给你提供一些思路和参考方法: 1. 在 Vue 页面中引入 html2canvas 库,并使用其中的 toDataURL 方法将页面截图生成 Base64 图片数据。 2. 使用 Canvas 在图片添加水印。 3. 可以添加多个水印,需要调整水印的位置和大小。 4. 最后将添加水印后的图片保存或上传到服务器。 下面是一个简单的示例代码,仅供参考: ``` <template> <div> <button @click="generateImage">生成图片</button> </div> </template> <script> import html2canvas from 'html2canvas'; export default { methods: { async generateImage() { const canvas = await html2canvas(document.querySelector('#target'), { useCORS: true, }); const ctx = canvas.getContext('2d'); const img = new Image(); img.src = canvas.toDataURL(); // 添加水印 img.onload = () => { // 添加第一个水印 ctx.font = 'bold 20px Arial'; ctx.fillStyle = 'rgba(255, 255, 255, 0.6)'; ctx.fillText('watermark1', 50, 50); // 添加第二个水印 ctx.font = 'bold 30px Arial'; ctx.fillStyle = 'rgba(255, 255, 255, 0.6)'; ctx.fillText('watermark2', 200, 200); // 将添加水印后的图片保存到本地 const link = document.createElement('a'); link.download = 'image.png'; link.href = canvas.toDataURL(); link.click(); }; }, }, }; </script> ``` 这里添加的两个水印只是示例,你可以根据需要添加更多的水印,并调整水印的位置和大小。同时,你需要注意浏览器的跨域问题,如果出现跨域问题,可以使用 `useCORS` 参数解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值