美文网首页
Img转换为canvas、写字、该canvas正常放大缩小、保存

Img转换为canvas、写字、该canvas正常放大缩小、保存

作者: 一座被占用 | 来源:发表于2018-06-22 12:46 被阅读0次

项目中有一个需求:实现画板的功能。提供一张图片。可以在上面写字,并且可以放大缩小。

1.图片转换为canvas

在render中先插入一张图片和一个canvas,给img添加src。等到src加载完成后。获取这个图片并绘制canvas(这边也可以使用new Image()方法)

代码:

    canvas.width = img.width;

    canvas.height = img.height;

    this.ctx = canvas.getContext("2d");

    this.ctx.drawImage(img,0,0,img.width,img.height);

    $(img).remove();

这样就把图片放到canvas中去

2.在这个canvas上写字

主要用到 lineTo方法技巧

var me = this;

this.ctx.lineWidth = 1;//笔触的粗细

this.ctx.strokeStyle = 'red'//笔的颜色

canvas.onmousedown = function(event){

    me.ctx.beginPath();

    me.moveTo(event.offsetX,event.offsetY);//从这里开始画

}

canvas.onmouseup = function(event){

    me.cxt.closePath();//结束

}

canvas.onmousemove = function(event){

    me.cxt.lineTo(event.offsetX,event.offsetY);//移动到

    me.cxt.stroke();//实现划线连接

}

3.保存canvas到本地图片

思路:把canvas转换成base64,然后使用node的filesystem的writeFile方法把buffer写入本地

var imgData = canvas.toDataURL("img/png");

var base64Data = imgData.replace(/^data:image\/\w+;base64,/, "");

var dataBuffer = new Buffer(base64Data,'base64');

fs.writeFile("C:/.../XXX.png",dataBuffer,function(err){})

4.缩放canvas大小是因为在这里遇到了问题。

我期望的效果是canvas缩小状态和放大状态都是一个东西。所有东西成比例呈现。但是在开发过程中发现。直接修改canvas的width和height属性,canvas的宽高变化了,但是里面的图却没有了。

网上查了一下,需要重新画一次。思路是先getImgData,然后再pushImgData。我照着做了一次。

var imgData = me.ctx.getImageData(0,0,canvas.width,canvas.height);

canvas.width  = newWidth;

canvas.height = newHeight;

me.ctx.putImageData(imgData.0.0)

然后我发现,这边是可以画出原来的图的。但是呢!新画的图还是原来的大小,而不是新的宽高的图。这个肯定不是我想要的。而且putImageData方法参数也没有提供可以设置imgData宽高的方法。我试着手动修改imgData的width和height属性,也报错说是只读的。

接着就把canvas转换成图片,把新生成的图片再画一次

var image = new Image();

image.src = canvas.toDataURL("image/png");

me.ctx.drawImage(image,0,0,oldWidth,oldHeight,0,0,newWidth,newHeight);

这个问题就得到解决了。

知其然不知其所以然

相关文章

网友评论

      本文标题:Img转换为canvas、写字、该canvas正常放大缩小、保存

      本文链接:https://www.haomeiwen.com/subject/pualeftx.html