Html Canvas Using Images

INTRO: 笔记,关于在canvas画布中使用图片资源,文章来源Mozilla Doc Center。

html5 canvas笔记

参考文章:https://developer.mozilla.org/en/Canvas_tutorial/Using_images

canvas最灵活的特征之一是可以使用图片,图片格式可以是png、jpg或gif,同一个页面上的其他canvas元素也可以当做图片源。

导入图片

在canvas画布上绘制图片之前我们需要提前获取需要绘制的图片对象,可以通过以下的几种方式来获得我们需要的图片对象。推荐使用script预加载来载入所需图片。

使用同一页面上的图片
我们可以通过document.images或者document.getElementsByTagName、document.getElementById方法来获取当前页面上的任意图片。

使用同一页面上的其他canvas元素
同样,使用document.getElementsByTagName、document.getElementById方法可以获取到页面上的canvas元素,它们也可以作为图片源被重新绘制。

一个比较实际的用途是通过第二个canvas元素来显示第一个canvas元素中的某些细节。

通过script载入图片

可以使用预加载的方式通过script载入图片,这很常见。

1
2
3
4
5
var img = new Image();   // 创建图片对象
img.onload = function(){
    // 在这里绘制图片
};
img.src = 'myImage.png'; // 设置目标图片的路径

通过data:url嵌入图片

data:url允许你通过一个base64位编码的字符串来直接定义一个图片。这里有关于data:url更详细的介绍。

在canvas上绘制图片

基本用法

当我们能够获得所需图片的引用时,可以使用drawImage方法将其渲染到canvas画布上。基本的使用方法是:

  • drawImage(image, x, y)

通过这种方法我们可以把图片定位到canvas画布的(x,y)坐标点上。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function draw() {
    var ctx = document.getElementById('canvas').getContext('2d');
    var img = new Image();
    img.src = 'images/backdrop.png';
    img.onload = function(){
        ctx.drawImage(img,0,0);
        ctx.beginPath();
        ctx.moveTo(30,96);
        ctx.lineTo(70,66);
        ctx.lineTo(103,76);
        ctx.lineTo(170,15);
        ctx.stroke();
    }
}

缩放

第二种方法附加了两个新的参数使我们可以很方便地对图片进行缩放。

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

同前一种使用方法一样,将图片渲染到canvas画布的(x,y)坐标点,width和height是设定缩放过后的图片大小,不需要单位,以像素度量。

例子

1
2
3
4
5
6
7
8
9
10
11
12
function draw() {
    var ctx = document.getElementById('canvas').getContext('2d');
    var img = new Image();
    img.src = 'images/rhino.jpg';
    img.onload = function(){
        for (i=0;i<4;i++){
            for (j=0;j<3;j++){
                ctx.drawImage(img,j*50,i*38,50,38);
            }
        }
    }
}

裁剪

最后一种方法是裁剪,它最复杂,同时功能也最强大。使用方法是:

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

通过一张示意图我们可以很容易地理解它的工作方式:

例子

1
2
3
4
5
function draw() {
    var ctx = document.getElementById('canvas').getContext('2d');
    ctx.drawImage(document.getElementById('source'),33,71,104,124,21,20,87,104);
    ctx.drawImage(document.getElementById('frame'),0,0);
}

最后推荐一个预加载图片序列的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function loadImage(srcList,callback){
    var imgs={};
    var totalCount=srcList.length;
    var loadedCount=0;
    for (var i=0;i<totalCount;i++){
        var img=srcList[i];
        var image=imgs[img.id]=new Image();		
        image.src=img.url;
        image.onload=function(event){
            loadedCount++;
        }		
    }
    if (typeof callback=="function"){
        var Me=this;
        function check(){
            if (loadedCount>=totalCount){
                callback.apply(Me,arguments);
            }else{		
                setTimeout(check,100);
            }	
        }
        check();
    }
    return imgs;
}

或许您对这些文章也感兴趣:

希望得到您的评论

(匿名是不被允许的)
(不会被公开)

DecImage.com 印象十二月 遥记那一季西部行

你不能逃避你的弱点,要不就奋起反击,要不就坐以待毙。如果真的是这样,为什么不从此时就开始呢?——Robert Louis Stevenson
感谢阅读我的文章,如果您需要订阅:RSS Feed | Comments RSS Feed

> 推荐两本看过的书

  • 艽野尘梦艽野尘梦全书5万多字,文言文书写,纸薄情长。读完全书,你必从此不会忘记一个叫西原的女子。
  • 幸福的建筑幸福的建筑阿兰·德波顿说他对任何的装饰都深恶痛绝,故我觉得他会和我一样喜欢北欧极简主义。
  • >友情链接

  • 零九的十二月 我在西部游走 像一个孩子一样