canvas 2.0 图片绘制

绘制图片drawImage

2013.02.21 by 十年灯·一条评论

本文属于《html5 Canvas画图系列教程

这里的绘制图片是指把一张现成的图片,绘制到Canvas上面。

有的人可能就有疑问了,既然是现成的图片,那干嘛用canvas来绘制,直接用img标签展现出来不就行了?

canvas上绘制图片,不是用来展示的,canvas功能更强大,比如,把图片画到canvas上,可以像PS中的滤镜一样,对图片进行修改,而且最后还能保存为新图片。

这些操作很复杂,我们先来看最基本的:如何把图片绘制到canvas上?

canvas中有个现成的绘制图片的方法即drawImage,他的语法如下:

drawImage(image, x, y)

drawImage(image, x, y, width, height)

drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)

你没有看错,drawImage就是有三种语法,越来越复杂。我们要由浅入深的学习:

1,drawImage(image, x, y)

这是最简单的使用方式。绘制图片嘛,当然要有一张“图”,image参数就是图——这个图可以是一张图片,也可以是另外一个canvas元素,记住!!

然后x,y就是canvas上的坐标,表示你要把图片画在哪个位置,这个不用多说。

这种使用方法,绘制的图片是原始大小

2,drawImage(image, x0,0, y, width, height)

如果只能把图片按原始大小绘制,那也太逊了。我们有时候需要对图片进行缩放,第2种用法中的width及height参数,即你决定把图片绘制的高度和宽度。

这个高度与宽度和原始图片无关,canvas会强制把图片按这个宽高绘制,如果图片太小,就会放大;大了则会缩小;比例不对则会变形。跟img的width和height差不多

3,drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)

第3种用法看起来很吓人,因为参数太多了,而且参数都是类似的。

大家注意到有一组参数以s开头,而另一组则以d开头,这是什么意思?

s其实是slice的意思,即切割;d你可以理解为draw。

切割的意思是,有时候我们不需要画出整个图片——可能一张图片上只有某个区域是我们想要的,这时候我们可以把想要的那一块切出来,在绘制到canvas上。

所以,(sx,sy)是原图片上开始切割的坐标,而(sWidth,sHeight)则是你要切割多宽多高;后面的dx,dy,dWidth,dHeight则与用法2相同。如:

这表示在原图jpg的10,10的位置开始切割下来一个200*200大小的块,然后把这块儿绘制到canvas上40,40的坐标处,并且大小依旧是200*200。

另外,s和d系列的参数,谁应该在前面呢?怎么才能记住他们的顺序?

先切再画,比先画再切更省事。画了再切,不就成了先画出多余的,又把多余的给切掉,这不是蛋疼吗?

建议大家自行测试一下dramImage的用法,可以加深印象。

大家测试的时候一定要记住:图片需要加载完成才能绘制出来。如果你是用JS载入图片,那你需要把绘制函数加在图片的onload事件上,才能确保绘制成功。

drawImage注意事项:

如果在原图上切割的范围,超出了图片本身的范围,会发生什么?会不会把已有在图片部分八绘制出来?

答:不会报错,但图片完全不会绘制出来,只会绘制一片空白。

最后,drawImage这三种方式,各自的参数个数是不能省略的。比如,我们在第3个使用方式中,打算切割把切割下来的200*200的图片依然按200*200绘制出来,那么我们可不可以不填最后那两个参数呢?是不是就默认200*200了?

答案是否定的,这样做只会报错。

原文地址:https://www.cnblogs.com/icat-510/p/10093483.html

时间: 2024-11-10 01:31:20

canvas 2.0 图片绘制的相关文章

ios系统 竖屏拍照 canvas处理后 图片旋转(利用exif.js解决ios手机上传竖拍照片旋转90度问题)

转:https://www.cnblogs.com/lovelgx/articles/8656615.html ---恢复内容开始--- 问题:html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 解决方法:利用exif.js解决ios手机上传竖拍照片旋转90度问题 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非横拍的ios照片进行角度旋转修正. 利用exif.js读取照片的拍摄信息,详见 htt

HTML5 Canvas ( 图片绘制 转化为base64 )

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>canvas</title> <script type="text/javascript" src="../js/jQuery.js"></script> <style type="text/css">

android开发步步为营之58:给图片绘制圆形气泡背景效果

最近在开发项目的时候,有一个需求,需要给应用图标绘制圆形气泡背景,有了彩色气泡这样显得漂亮一点,气泡的颜色是应用图标的颜色均值,先看看效果,然后,我再给出demo. demo应用图标是这样的: 添加气泡背景后是这样的: 仔细看圆形背景颜色是图标颜色的均值. 好的,下面我们来完成这个demo. 第一步.编写页面activity_drawcycle.xml <?xml version="1.0" encoding="utf-8"?> <LinearLa

CANVAS运用-对图片的压缩上传(仅针对移动浏览器)

最近在移动端设计头像上传功能时,原本是以<input type="file">直接通过formData上传,然而实际使用情况是:对于过大的图片(高像素手机所拍摄的照片等)上传时间过长会导致上传失败,而每次都上传原始大小的图片(后台处理压缩)十分影响用户体验,所以研究了一下通过canvas压缩图片并上传的方法,以下是整理的一些思路和心得: 一.<input type="file">获取本地图片,并将图片绘制到画布中.此处的难点在于:由于浏览器的

canvas生成遮罩图片

首先我们知道css3中增加了不少好用.好玩的css3样式可以使用.今天我们要说到是遮罩. 它的使用方式也不复杂,和background使用方式差不多.使用mask-image就可以使用,这样就可以通过图片合成一张带有形状的合成图了,不需要直接使用PS处理了.CSS遮罩——如何在CSS中使用遮罩,这篇文章已经详细说明了遮罩如何使用了,我这里就不赘述了.今天我这里想要说明的是,如何通过这个完成生成一个合成图片的逻辑. 它通过两种方式:前端JS+canvas,后端nodejs+canvas,完成基本思

用canvas 实现个图片三角化(LOW POLY)效果

之前无意中看到Ovilia?用threejs做了个LOW POLY,也就是图片平面三角化的效果,觉得很惊艳,然后就自己花了点时间尝试了一下. 我是没怎么用过threejs,所以就直接用canvas的2d绘图API来做,因为感觉似乎这效果也用不上threejs. 直接上demo先:http://whxaxes.github.io/canvas-test/src/Funny-demo/lowpoly/index.html? ?(也可以在移动端看,不过因为计算量比较大,移动设备计算起来会比PC要多花些

[js高手之路] html5 canvas系列教程 - 图片操作(drawImage,clip,createPattern)

接着上文[js高手之路] html5 canvas系列教程 - 文本样式(strokeText,fillText,measureText,textAlign,textBaseline)继续,本文介绍的内容是canvas开发,特别是游戏中,比较常用的内容:图片处理.在游戏中的资源大多数都是加载图片. 一.canvas怎么加载图片? canvas提供3种图片加载的API调用方式. drawImage( image, dx, dy ) drawImage( image, dx, dy, dw, dh

用canvas给视频图片添加特效

Canvas制作视频图片特效 1. Canvas介绍 1.1Canvas是html5上的一个画布标签,功能有点类似java的swing.可以在canvas上画线条 弧线, 文字 就是画布的功能. 具体提供的js函数看http://www.w3school.com.cn/tags/html_ref_canvas.asp 2 简单介绍一下使用: Var canvas = document.documentElementById(“canvasId”); Var ctx = canvas.getCon

解决 canvas 下载含图片的画布时的报错

Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported 1:背景 最近在做一个图片内容识别的项目,采用的是阿里巴巴的付费接口.大致流程为: 1:用户上传图片 2:将图片转为base64的格式发送给阿里的接口 3:阿里接口返回图片的内容信息 2:遇到的问题 这里边第二步转base64 ,我采用html5的canvas,将图片绘制