canvas 进阶

之前我们写的都是canvas基础类型的练习,从今天开始,就要进入更深一级的学习当中了

一、图形的组合方式

217E03B8-56C8-45D0-BD30-53A711D26A21.png

下面我们来试验几种方式

什么是源图和目标图?

源图:可以简单的理解为后画的图;
目标图:可以理解为先画的图形;

globalCompositeOperation 是设置在目标图上的

在未设置前:

9F4DAF27-770B-4239-AD8D-7AD7DDCE7DF4.png
source-in:设置组合方式,只保留源图的重叠部分
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
context.beginPath();
context.arc(100,100,50,0,Math.PI*2)
context.fillStyle="red";
context.fill();
context.globalCompositeOperation = "source-in";
        
context.beginPath();
context.arc(150,100,50,0,Math.PI*2);
context.fillStyle="#808080";
context.fill();

设置后:


E56E041B-591E-494B-911C-BB7C1BF08996.png
source-out:设置组合方式,只保留源图的未重叠部分
        context.globalCompositeOperation = "source-out";

设置后:

0DC79ECB-7B15-43D2-B818-ED23BACAC3B5.png
destination-over:设置组合方式,当前图形在下面
        context.globalCompositeOperation = "destination-over";
C337C23F-295C-442C-B322-8328E636378E.png

二、图像的处理

1、图片的加载

绘制图片只有一个方法,但方法里的参数有三种方式


7996A794-4ED2-4F9A-A9FC-C12897BB2D05.png
载入图片
FA880EDE-2284-43D3-9C4C-B23F3D6A0112.png

绘制图片一定要在图片加载完成之后执行

var img = new Image();
img.src = "df.jpg";
img.onload = function(){
    context.drawImage(img,0,0);
}
控制图片
C9BDA956-D508-47BB-866D-C52418FFF2DF.png
var img = new Image();
img.src = "df.jpg";
img.onload = function(){
    context.drawImage(img,0,0,canvas.width,canvas.height);
}
裁剪图片
image.png
var img = new Image();
img.src = "df.jpg";
img.onload = function(){
    context.drawImage(img,0,0,100,100,50,50,img.width,img.height);
}

2、像素

  • 我们使用getImageData()能够获取指定区域的像素值ImageData

  • ImageData中3个属性:width,height和data

  • width和height表示访问像素区域大小

  • data是一个包含访问区域所有像素信息的CanvasPixeArray

  • CanvasPixeArray是一个一维数组

  • 每一个像素用4个整数(r,g,b,a)值表示,范围0~255

  • 像素操作方法
    getImageData(x,y,width,height):获取像素,(x,y)像素区域原点坐标
    (width,height)像素区域的宽度和高度

putImageData():


0AB4847A-95C2-4949-A34F-818CCDEDA359.png
灰度
image.png
var img = new Image();
        img.src = "img/beautiful.jpg";
        img.onload = function(){
            context.drawImage(img,0,0);
            var imgData = context.getImageData(0,0,myCanvas.width,myCanvas.height);
            console.log(imgData.data);
            var piexls = imgData.data;
            for (var i = 0; i < piexls.length;i+=4) {
                var r = piexls[i];
                var g = piexls[i+1];
                var b = piexls[i+2];
                var gray = parseInt((r+g+b)/3);
                piexls[i] = gray;
                piexls[i+1] = gray;
                piexls[i+2] = gray;
                
            }
反色
EE8BA357-3C70-4822-BC44-B6E3482BFC81.png
var canvas = document.getElementById("mycanvas");
        var context=canvas.getContext("2d");
        var img = new Image();
        img.src = "df.jpg";
        img.onload = function(){
            context.drawImage(img,0,0);
            //获取所有像素点
            var imgData = context.getImageData(0,0,500,500);
            console.log(imgData)
            for(var i=0;i<imgData.data.length;i +=4){
                var r = imgData.data[i];
                var g = imgData.data[i+1];
                var b = imgData.data[i+2];
                var a = imgData.data[i+3];
                
                //反色处理
                imgData.data[i]=255-r;
                imgData.data[i+1]=255-g;
                imgData.data[i+2]=255-b;
                
            }
            //将改完的像素重新放到画布上
            context.putImageData(imgData,100,100)
        }

3、视频的处理

image.png
image.png
动画帧

requestAnimationFrame不需要使用者指定循环间隔时间,浏览器会基于当前页面是否可见、CPU的负荷情况等来自行决定最佳的帧速率,从而更合理地使用CPU。

通过setTimeout和setInterval方法来在脚本中实现动画,但是这样效果可能不够流畅,且会占用额外的资源。
1、即使向其传递毫秒为单位的参数,它们也不能达到ms的准确性。这是因为javascript是单线程的,可能会发生阻塞。
2、没有对调用动画的循环机制进行优化。
3、没有考虑到绘制动画的最佳时机,只是一味地以某个大致的事件间隔来调用循环。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • 我们可以把canvas应用于整个浏览器窗口或者其中的一部分之上,这种技术通常被称作"玻璃窗"。应用场景1.可以编写...
    IT小C阅读 811评论 0 0
  • 一、图形的组合方式 globalAlpha是一个介于0和1之间的值(包括0和1),用于指定所有绘制的透明度。默认值...
    空谷悠阅读 1,261评论 0 0
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,736评论 0 2
  • 伊川王利珍坚持原创分享第387天 今天晚上的课程状况百出。先是电脑打不开,然后是音乐不能放,再后来幻灯片也播不出来...
    宛如初夏阅读 345评论 0 0
  • 公交车上,两位奶奶开启吐槽各自儿子媳妇模式。 烫花头的奶奶说:“上那什么龟孙快班,小孩天天都累死了,...
    鬼无心阅读 280评论 1 1