Canvas2D基础

简介: 1. canvas内容就是上面这些了,就好比设计师能用的颜色就那么多,但是将颜色,图形组合起来,创意真的是无限的,canvas也是如此。2. webGL是一个 对OpenGL ES 2.0浏览器实现接口,用于3D绘画,生产阶段最好不要用,可用于实验阶段。

Canvas2D基础


Canvas2D基础

Canvas2D基础

什么是Canvas

基本使用

Rectangles(矩形)

Drawing Paths

Drawing Text

Transformations

Drawing Images 图片绘制

shadows 加阴影

Gradients 渐变色

Patterns 模式

Working with Image Data 图像原始数据

Compositing 合成

总结

Canvas2D基础

什么是Canvas

是H5中最受欢迎的元素,在页面上划出一片区域,利用JS在上面画出图形,起初由Apple公司提出,各大浏览器厂商也对其做了不同程度上的实现。canvas中规定了了2D context和3D context(WebGL),目前绝大部分浏览器支持2D context。WebGL的发展还比较缓慢。


基本使用


1、toDataURL() 将画好的图像输出为图片


//get data URI of the image
var imgURI = drawing.toDataURL("image/png");
//display the image
var image = document.createElement("img");
image.src = imgURI;
document.body.appendChild(image);


2、原点是基于canvas元素左上角


3、2D Context的两个基本绘画操作 fill and stroke


Rectangles(矩形)


1、fillRect()



context.fillRect(10, 10, 50, 50);
//draw a blue rectangle that’s semi-transparent
context.fillStyle = "rgba(0,0,255,0.5)";
context.fillRect(30, 30, 50, 50);


2、strokeRect()



//draw a red outlined rectangle
context.strokeStyle = "#ff0000";
context.strokeRect(10, 10, 50, 50);
//draw a blue outlined rectangle that’s semi-transparent
context.strokeStyle = "rgba(0,0,255,0.5)";
context.strokeRect(30, 30, 50, 50);


3、clearRect()



//draw a red rectangle
context.fillStyle = "#ff0000";
context.fillRect(10, 10, 50, 50);
//draw a blue rectangle that’s semi-transparent
context.fillStyle = "rgba(0,0,255,0.5)";
context.fillRect(30, 30, 50, 50);
//clear a rectangle that overlaps both of the previous rectangles
context.clearRect(40, 40, 10, 10);


Drawing Paths


1、如何画一个表盘


var drawing = document.getElementById("drawing");
//make sure <canvas> is completely supported
if(drawing.getContext) {
    var context = drawing.getContext("2d");
    //start the path
    context.beginPath();
    //draw outer circle
    context.arc(100, 100, 99, 0, 2 * Math.PI, false);
    //draw inner circle
    context.moveTo(194, 100); //将光标移动这个内圆绘制的起点上
    context.arc(100, 100, 94, 0, 2 * Math.PI, false);
    //draw minute hand
    context.moveTo(100, 100);
    context.lineTo(100, 15); // 从最后绘制点到(100,15)绘制一条线
    //draw hour hand
    context.moveTo(100, 100);
    context.lineTo(35, 100);
    //stroke the path
    context.stroke();
}



2、判断一个坐标点是否在绘制路线上


context.isPointInPath(100, 100) // true


Drawing Text


1、fillText() 、  strokeText() 后者很少用


2、3个属性font、 textAlign、 textBaseline


3、Demo



context.font = "bold 14px Arial";
context.textAlign = "center";
context.textBaseline = "middle";
context.fillText("12", 100, 20);
//start-aligned
context.textAlign = "start";
context.fillText("12", 100, 40);
//end-aligned
context.textAlign = "end";
context.fillText("12", 100, 60);


4、measureText()的使用 可以度量文字大小


// 如果文字的长度大于140,就将字体缩小
var fontSize = 100;
context.font = fontSize + "px Arial";
while(context.measureText("Hello world!").width > 140) {
    fontSize--;
    context.font = fontSize + "px Arial";
}
context.fillText("Hello world!", 10, 10);
context.fillText("Font size is " + fontSize + "px", 10, 50);



Transformations

图像变换方法

rotate(angle)

scale(scaleX, scaleY)

translate(x, y)

transform(m1_1, m1_2, m2_1, m2_2, dx, dy)

setTransform(m1_1, m1_2, m2_1, m2_2, dx, dy)


可用translate重新定义原点的位置,

在画圆的时候,可将原点位置移动圆心位置,这样在画圆定位过程中比较方便


context.rotate 注意是将坐标轴进行旋转



Drawing Images 图片绘制


从当前canvasd的坐标(10,10)的位置将图片插入进来(注意,如果图片在canvas中装不下,那么图片是插入不进来的)

var image = document.images[0];
 context.drawImage(image, 10, 10);


1. 指定区域内插入 -- 执行在从(10,10)开始,宽90,高90的区域内绘制图像


context.drawImage(image, 10, 10,90,90)



将图像上指定区域的部分 插入 canvas中的指定区域(相当于剪切原图像上的一部分到canvas中)


//从图像上(0,10)开始,宽150,高385的区域插入到 canvas中从(0,100)开始,宽40,高60的区域内
context.drawImage(image, 0, 10, 150, 385, 0, 100, 40, 60);



  1. 注意,如果插入进来的图片是在别的域名下的,会报错


shadows 加阴影


DEMO:



shadows 加阴影

DEMO:


var drawing = document.getElementById("drawing");
var context = drawing.getContext("2d");
context.shadowOffsetX = 5;
context.shadowOffsetY = 5;
context.shadowBlur = 4;
context.shadowColor = "rgba(0, 0, 0, 0.5)";
//draw a red rectangle
context.fillStyle = "#ff0000";
context.fillRect(10, 10, 50, 50);
//draw a blue rectangle
context.fillStyle = "rgba(0,0,255,1)";
context.fillRect(30, 30, 50, 50);


Gradients 渐变色


1. 线性渐变



var gradient = context.createLinearGradient(30, 30, 80, 80);
gradient.addColorStop(0, "white");
gradient.addColorStop(1, "black");
context.fillStyle = gradient;
context.fillRect(30, 30, 50, 50);


1.径项渐变



var gradient = context.createRadialGradient(55, 55, 10, 55, 55, 30);
gradient.addColorStop(0, "white");
gradient.addColorStop(1, "black");
context.fillStyle = gradient;
context.fillRect(30, 30, 50, 50);


Patterns 模式

即图像的重复模式 ,跟css一样 “repeat”, “repeat-x”, “repeat-y”, no-repeat”


var context = drawing.getContext("2d");
var image = document.images[0],
    pattern = context.createPattern(image, "repeat");
//draw a rectangle
context.fillStyle = pattern;  // 图像repeat模式仍然是从(0,0)开始的
context.fillRect(30, 0, 150, 150); // 这里的意思是绘制矩形,并让图像repeat模式在该矩形区域显示,并不是说 图片repeat是从绘制该矩形的起点开始的,渐变也是如此



Working with Image Data 图像原始数据

可以用来做滤镜效果,详细可看  www.html5rocks.com/en/tutorials/canvas/imagefilters/


Compositing 合成

两个图像之间如何纠缠的,这里举一个例子,其他雷同



两个图像之间如何纠缠的,这里举一个例子,其他雷同


var drawing = document.getElementById("drawing");
var context = drawing.getContext("2d");
//draw a red rectangle
context.fillStyle = "#ff0000";
context.fillRect(10, 10, 50, 50);
//change the global alpha
context.globalCompositeOperation = "xor";
//draw a blue rectangle
context.fillStyle = "rgba(0,0,255,1)";
context.fillRect(30, 30, 50, 50);


总结


  1. canvas内容就是上面这些了,就好比设计师能用的颜色就那么多,但是将颜色,图形组合起来,创意真的是无限的,canvas也是如此。


  1. webGL是一个 对OpenGL ES 2.0浏览器实现接口,用于3D绘画,生产阶段最好不要用,可用于实验阶段。
目录
相关文章
|
虚拟化 数据安全/隐私保护
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch基础之张量模块数据类型、基本操作、与Numpy数组的操作详解(附源码 简单全面)
PyTorch基础之张量模块数据类型、基本操作、与Numpy数组的操作详解(附源码 简单全面)
257 0
|
前端开发 JavaScript API
如何使用 Canvas 实现复杂的动画效果?
【10月更文挑战第24天】使用Canvas实现复杂的动画效果,需要综合运用JavaScript、数学知识以及对Canvas API的深入理解。
587 63
|
Web App开发 安全 应用服务中间件
|
8月前
|
前端开发 JavaScript API
给Web开发者的HarmonyOS指南01-文本样式
本系列教程适合 HarmonyOS 初学者,为那些熟悉用 HTML 与 CSS 语法的 Web 前端开发者准备的。
280 5
给Web开发者的HarmonyOS指南01-文本样式
|
11月前
|
存储 传感器 编解码
ROS机器视觉入门:从基础到人脸识别与目标检测
前言 从本文开始,我们将开始学习ROS机器视觉处理,刚开始先学习一部分外围的知识,为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本,系统采用Ubuntu20.04,ROS采用noetic。 颜色编码格式,图像格式和视频压缩格式 (1)RGB和BGR:这是两种常见的颜色编码格式,分别代表了红、绿、蓝三原色。不同之处在于,RGB按照红、绿、蓝的顺序存储颜色信息,而BGR按照蓝、绿、红的顺序存储。 rgb8图像格式:常用于显示系统,如电视和计算机屏幕。 RGB值以8 bits表示每种颜色,总共可以表示256×256×256=16777216种颜色
463 70
|
9月前
|
人工智能 JavaScript Java
看阿里云技术内容工程师如何巧用通义灵码
看阿里云技术内容工程师如何巧用通义灵码
|
11月前
|
前端开发
如何选择网站模版?网站模版建站优势。
本文介绍了为什么越来越多用户选择使用成熟的网站模版,而不是建站公司。推荐PageAdmin CMS网站模版,其界面友好、主题高质量且有品牌知名度。
226 25
|
自然语言处理 供应链 数据可视化
大数据在市场营销中的应用案例:精准洞察,驱动增长
【8月更文挑战第25天】大数据在市场营销中的应用案例不胜枚举,它们共同展示了大数据技术在精准营销、市场预测、用户行为分析等方面的巨大潜力。通过深度挖掘和分析数据,企业能够更加精准地洞察市场需求,优化营销策略,提升市场竞争力。未来,随着大数据技术的不断发展和普及,其在市场营销领域的应用将更加广泛和深入。
3218 3
|
自然语言处理