canvas教程

通过Canvas绘图并生成保存为本地图片的方法

字号+ 作者:H5之家 来源:H5之家 2017-06-28 15:01 我要评论( )

从一个画布获取像素数据是相当简单的。在我们开始写一些代码之前,应该指出的是,你只能得到本地图像数据,无论如何,你可以在画布上描绘跨域图片,但你却不能获取

       

toDataURL()

       在过去的几个月里,我们已经关于HTML5画布谈了很多。HTML5画布提供有许多其他有趣的接口,这使得它迄今为止为最迷人的和灵活的对象。今天我们要学习如何把你的画布保存为一个图像。

       从一个画布获取像素数据是相当简单的。在我们开始写一些代码之前,应该指出的是,你只能得到本地图像数据,无论如何,你可以在画布上描绘跨域图片,但你却不能获取跨域图片的像素数据信息。这也是为了安全考虑。

       canvas提供了toDataURL的接口,可以方便的将canvas画布转化成base64编码的image。目前支持的最好的是png格式,jpeg格式的现代浏览器基本也支持,但是支持的不是很好。

       我们创建一个画布,在上面做一些绘图,然后试着把它保存为本地图片。

       HTML代码:

<div>     <img src="http://www.html5party.com/wp-content /uploads/2013/09/css_yangshijiance.png" />     <img src="http://www.html5party.com/wp-content /uploads/2013/09/canvas_chroma.png" /> </div> <div>     <a href="javascript:void(0);">Image Tag</a> |     <a href="javascript:void(0);">New Window</a> |     <a href="javascript:void(0);">Download</a> </div> <div>     <canvas /> </div>

       好的,一口气把js脚本添加在后面:

var can = document.getElementById('canvas'); var ctx = can.getContext('2d'); var imgA = new Image(); imgA.src ='http://www.html5party.com/wp-content /uploads/2013/09/css_yangshijiance.png'; imgA.onload = function() {   ctx.drawImage(imgA, -25, 0, imgA.width, imgA.height);   ctx.restore(); }; var imgB = new Image(); imgB.src = 'http://www.html5party.com/wp-content /uploads/2013/09/canvas_chroma.png'; imgB.onload = function() {   ctx.globalAlpha = 0.1   ctx.drawImage(imgB, -100, -75, imgB.width, imgB.height);   ctx.restore(); }; function toImage(returnType) {   var dataURL = document.getElementById('canvas').toDataURL("image/png");   // The returnType argument specifies how to get the   // the image.  'obj' will set the source to an image element.   // 'window' will open a new window and display the image.   // 'download' will prompt the user to save the image.   switch(returnType) {     case 'obj':       var imgObj = new Image();       imgObj.src = dataURL;       document.getElementById('graphics').appendChild(imgObj);       break;     case 'window':       window.open(dataURL, "Canvas Image");       break;     case 'download':       dataURL = dataURL.replace("image/png", "image/octet-stream");       document.location.href = dataURL;       break;   } }

       理想的状态是页面上有三个点击链接:

        1、Image Tag

           点击会有一张图片插入在网页中。

        2、New Window

          打开一个新的窗口,并显示一个PNG格式的图片

        3、Download

          下载保存一张PNG个格式的图片

       很不幸,点击并没有反映,为什么呢?笔者做了许多试验,原因出在图片渲染上,canvas上如果添加图片,toDataURL()将失效,获取不到canvas信息。通过简单几步来验证这个问题。

       把js脚本中图片渲染的部分去除,A和B图。为了便于观察,在画布上画一个简单的矩形,填充颜色:

            ctx.fillStyle = 'Red';             ctx.strokeStyle = 'Green';             ctx.beginPath();             ctx.rect(20, 20, 100, 100);             ctx.stroke();             ctx.fill();

       这样画布上便显示为一个红色矩形,格式为PNG:

       上述的三个点击链接生效了。没有找到更深层次的原因,也许是canvas还在不断完善中,暂时无法转换渲染图片编码。不过不影响作图,如果有读者有更好的理解,还望不吝赐教!

       HTML5Party编辑整理。

toDataURL()

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • T3菜单,megamenu和Off-canvas Sidebar 和 小屏幕的菜单

    T3菜单,megamenu和Off-canvas Sidebar 和 小屏幕的菜单

    2017-06-29 14:03

  • canvas学习总结三:绘制虚线,canvas虚线

    canvas学习总结三:绘制虚线,canvas虚线

    2017-06-28 15:01

  • Web 版 powerdesigner (Canvas) 技术分享

    Web 版 powerdesigner (Canvas) 技术分享

    2017-06-27 18:01

  • android Graphics(四):canvas变换与操作

    android Graphics(四):canvas变换与操作

    2017-06-27 18:00

网友点评