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

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

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

这个问题就得到解决了。

知其然不知其所以然

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,707评论 2 32
  • 1 Canvas接口元素定义 1.1 getContext()方法 为了在canvas上绘制,你必须先得到一个画布...
    Kevin_Junbaozi阅读 1,349评论 1 2
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    Looog阅读 3,953评论 3 40
  • 在项目中,需要生成海报。有动态信息(微信头像、微信昵称、上传图片(oss链接)、二维码)+ 海报背景图生成一张海报...
    奔跑吧笨笨阅读 7,724评论 0 0
  • 这是一个爱画画的女子 骄傲并且执着 涂抹着属于自己的东西 她是小七 此刻 给你一个春天的凝视 光滑速写纸 施德楼铅...
    陈狂阅读 1,805评论 48 72