0

0

使用HTML5 Canvas为图片填充颜色和纹理的教程_html5教程技巧

php中文网

php中文网

发布时间:2016-05-16 15:45:33

|

3307人浏览过

|

来源于php中文网

原创

填充颜色

艺术离不开色彩,今天咱们来介绍一下填充颜色,体会一下色彩的魅力。
填充颜色主要分为两种:

1.基本颜色
2.渐变颜色(又分为线性渐变与径向渐变)

我们一个个来看。


填充基本颜色
Canvas fillStyle属性用来设置画布上形状的基本颜色和填充。fillStyle使用简单的颜色名称。这看起来非常简单,例如:

立即学习前端免费学习笔记(深入)”;

JavaScript Code复制内容到剪贴板
  1. context.fillStyle = "red";  

下面是出自 HTML4 规范的可用颜色字符串值列表,共十六个。由于 HTML5 没有修改专属的颜色,HTML4 的颜色都可以在 HTML5 中正确显示。
2016321111603054.png (664×656)

所有这些颜色值都可以应用到 strokeStyle 属性和 fillStyle 属性中。
好了,我来总结一下填充基本色的方法:(也可用于strokeStyle属性)
(1) 使用颜色字符串填充。

JavaScript Code复制内容到剪贴板
  1. context.fillStyle = "red";  

(2)使用十六进制数字字符串填充。

JavaScript Code复制内容到剪贴板
  1. context.fillStyle = "#FF0000";  

(3)使用十六进制数字字符串简写形式填充。

JavaScript Code复制内容到剪贴板
  1. context.fillStyle = "#F00";  

(4)使用rgb()方法设置颜色。

JavaScript Code复制内容到剪贴板
  1. context.fillStyle = "rgb(255,0,0)";  

(5)使用rgba()方法设置颜色。
JavaScript Code复制内容到剪贴板

  1. context.fillStyle = "rgba(255,0,0,1)";  

此方法最后一个参数传递的是alpha值,透明度范围为1(不透明)~0(透明)。
(6)使用hsl()方法设置颜色。

JavaScript Code复制内容到剪贴板
  1. context.fillStyle = "hsl(0,100%,50%)";  

HSL即是代表色相(H),饱和度(S),明度(L)三个通道的颜色。
(7)使用hsla()方法设置颜色。

JavaScript Code复制内容到剪贴板
  1. context.fillStyle = "hsla(0,100%,50%,1)";  

以上7句代码都是填充"#FF0000"这个红色。


填充渐变形状
在画布上创建渐变填充有两个基本选项:线性或径向。线性渐变创建一个水平、垂直或者对角线的填充图案。径向渐变自中心点创建一个放射状填充。填充渐变形状分为三步:添加渐变线,为渐变线添加关键色,应用渐变。下面是它们的一些示例。
线性渐变
三步走战略:
添加渐变线:

JavaScript Code复制内容到剪贴板
  1. var grd = context.createLinearGradient(xstart,ystart,xend,yend);  


为渐变线添加关键色(类似于颜色断点):

JavaScript Code复制内容到剪贴板
  1. grd.addColorStop(stop,color);  


这里的stop传递的是 0 ~ 1 的浮点数,代表断点到(xstart,ystart)的距离占整个渐变色长度是比例。

应用渐变:

JavaScript Code复制内容到剪贴板
  1. context.fillStyle = grd;   
  2. context.strokeStyle = grd;  


写个代码来看看。

JavaScript Code复制内容到剪贴板
  1. nbsp;html>   
  2. "zh">   
  3.   
  4.      "UTF-8">   
  5.     填充线性渐变   
  6.   
  7.   
  8. "canvas-warp">   
  9.     "canvas" style="border: 1px solid #aaaaaa; display: block; margin: 50px auto;">   
  10.         你的浏览器居然不支持Canvas?!赶快换一个吧!!   
  11.        
  
  •   
  •     window.onload = function(){   
  •         var canvas = document.getElementById("canvas");   
  •         canvas.width = 800;   
  •         canvas.height = 600;   
  •         var context = canvas.getContext("2d");   
  •   
  •         context.rect(200,100,400,400);   
  •   
  •         //添加渐变线   
  •         var grd = context.createLinearGradient(200,300,600,300);   
  •   
  •         //添加颜色断点   
  •         grd.addColorStop(0,"black");   
  •         grd.addColorStop(0.5,"white");   
  •         grd.addColorStop(1,"black");   
  •   
  •         //应用渐变   
  •         context.fillStyle = grd;   
  •   
  •         context.fill();   
  •   
  •     }   
  •   
  •   
  •   
  • 运行结果:
    2016321112313533.jpg (850×500)

    我觉得有必要做一个图解,方便大家一次性理解渐变。
    2016321112349410.jpg (850×500)

    为了方便理解,建议把渐变线看成是一个有向线段。如果熟悉PS等绘图工具,用过其中的渐变色设置,应该会很好理解。
    这里渐变线的起点和终点不一定要在图像内,颜色断点的位置也是一样的。但是如果图像的范围大于渐变线,那么在渐变线范围之外,就会自动填充离端点最近的断点的颜色。
    这里配合两个补充函数再举一例。

    绘制矩形的快捷方法

    Copy Leaks
    Copy Leaks

    AI内容检测和分级,帮助创建和保护原创内容

    下载
    JavaScript Code复制内容到剪贴板
    1. fillRect(x,y,width,height)、stroke(x,y,width,height)。这两个函数可以分别看做rect()与fill()以及rect()与stroke()的组合。因为rect()仅仅只是规划路径而已,而这两个方法确实实实在在的绘制。   
    2. nbsp;html>   
    3. "zh">   
    4.   
    5.      "UTF-8">   
    6.     填充线性渐变   
    7.   
    8.   
    9. "canvas-warp">   
    10.     "canvas" style="border: 1px solid #aaaaaa; display: block; margin: 50px auto;">   
    11.         你的浏览器居然不支持Canvas?!赶快换一个吧!!   
    12.        
      
  •   
  •     window.onload = function(){   
  •         var canvas = document.getElementById("canvas");   
  •         canvas.width = 800;   
  •         canvas.height = 600;   
  •         var context = canvas.getContext("2d");   
  •   
  •         //添加渐变线   
  •         var grd = context.createLinearGradient(100,300,700,300);   
  •   
  •         //添加颜色断点   
  •         grd.addColorStop(0,"olive");   
  •         grd.addColorStop(0.25,"maroon");   
  •         grd.addColorStop(0.5,"aqua");   
  •         grd.addColorStop(0.75,"fuchsia");   
  •         grd.addColorStop(0.25,"teal");   
  •   
  •         //应用渐变   
  •         context.fillStyle = grd;   
  •         context.strokeStyle = grd;   
  •   
  •         context.strokeRect(200,50,300,50);   
  •         context.strokeRect(200,100,150,50);   
  •         context.strokeRect(200,150,450,50);   
  •   
  •         context.fillRect(200,300,300,50);   
  •         context.fillRect(200,350,150,50);   
  •         context.fillRect(200,400,450,50);   
  •   
  •         context.fillRect(0,550,800,25);   
  •   
  •     }   
  •   
  •   
  •   
  • 运行结果:
    2016321113029539.jpg (850×500)

    这两个页面都是水平渐变,但是要清楚线性渐变不一定是水平的,方向可以是任意的,通过渐变线的端点来设置方向。

    径向渐变
    同样是三步走战略,只不过是第一步的所用方法变了。
    添加渐变圆:

    JavaScript Code复制内容到剪贴板
    1. var grd = context.createRadialGradient(x0,y0,r0,x1,y1,r1);  

    为渐变线添加关键色(类似于颜色断点):

    JavaScript Code复制内容到剪贴板
    1. grd.addColorStop(stop,color);  


    应用渐变:

    JavaScript Code复制内容到剪贴板
    1. context.fillStyle = grd;   
    2. context.strokeStyle = grd;  


    线性渐变是基于两个端点定义的,但是径向渐变是基于两个圆定义的。
    我们把示例7-2改写一下。

    JavaScript Code复制内容到剪贴板
    1. nbsp;html>   
    2. "zh">   
    3.   
    4.      "UTF-8">   
    5.     填充径向渐变   
    6.   
    7.   
    8. "canvas-warp">   
    9.     "canvas" style="border: 1px solid #aaaaaa; display: block; margin: 50px auto;">   
    10.         你的浏览器居然不支持Canvas?!赶快换一个吧!!   
    11.        
      
  •   
  •     window.onload = function(){   
  •         var canvas = document.getElementById("canvas");   
  •         canvas.width = 800;   
  •         canvas.height = 600;   
  •         var context = canvas.getContext("2d");   
  •   
  •         //添加渐变线   
  •         var grd = context.createRadialGradient(400,300,100,400,300,200);   
  •   
  •         //添加颜色断点   
  •         grd.addColorStop(0,"olive");   
  •         grd.addColorStop(0.25,"maroon");   
  •         grd.addColorStop(0.5,"aqua");   
  •         grd.addColorStop(0.75,"fuchsia");   
  •         grd.addColorStop(0.25,"teal");   
  •   
  •         //应用渐变   
  •         context.fillStyle = grd;   
  •   
  •         context.fillRect(100,100,600,400);   
  •   
  •   
  •     }   
  •   
  •   
  •   
  • 运行结果:
    2016321113454037.jpg (850×500)

    怎么感觉这个颜色搭配那么的……算了,这个就叫做艺术。
    createRadialGradient(x0,y0,r0,x1,y1,r1);方法规定了径向渐变开始和结束的范围,即两圆之间的渐变。
    总结一下,这节课我们学习了fillStyle、createLinearGradient()、createRadialGradient()、addColorStop()、fillRect()、strokeRect()等属性和方法,详细介绍了填充基本色、线性渐变、径向渐变。
    好了,现在学会了上色,那么尽情的使用色彩,绘制出属于我们自己的艺术品吧!

    填充纹理

    createPattern()简介
    纹理其实就是图案的重复,填充图案通过createPattern()函数进行初始化。它需要传进两个参数createPattern(img,repeat-style),第一个是Image对象实例,第二个参数是String类型,表示在形状中如何显示repeat图案。可以使用这个函数加载图像或者整个画布作为形状的填充图案。
    有以下4种图像填充类型:

    1.平面上重复:repeat;
    2.x轴上重复:repeat-x;
    3.y轴上重复:repeat-y;
    4.不使用重复:no-repeat;

    其实createPattern()的第一个参数还可以传入一个canvas对象或者video对象,这里我们只讲解Image对象,其余的大家自己尝试。


    创建并填充图案
    首先看一下怎么加载图像:

    创建Image对象
    为Image对象指定图片源

    代码如下:

    JavaScript Code复制内容到剪贴板
    1. var img = new Image();    //创建Image对象   
    2. img.src = "8-1.jpg";    //为Image对象指定图片源  

    扩展:HTML中的相对路径
    './目录或文件名' 或者 '目录或文件名' 是指当前操作的文件所在目录的路径
    '../目录或文件名' 是指当前所操作的文件所在目录的上一级目录的路径

    之后填充纹理:

    JavaScript Code复制内容到剪贴板
    1. var pattern = context.createPattern(img,"repeat");   
    2. context.fillStyle = pattern;  

    我们直接看一段完整的程序,这里我要重复填充这个萌萌的长颈鹿作为纹理。需要注意的是,选择图片时一定要选择那种左右互通,上下互通的图片做为纹理,这样看上去才不会有不自然的短接处。
    2016321113732587.jpg (321×400)

    下面提供代码。

    JavaScript Code复制内容到剪贴板
    1. nbsp;html>   
    2. "zh">   
    3.   
    4.      "UTF-8">   
    5.     填充纹理   
    6.   
    7.   
    8. "canvas-warp">   
    9.     "canvas" style="border: 1px solid #aaaaaa; display: block; margin: 50px auto;">   
    10.         你的浏览器居然不支持Canvas?!赶快换一个吧!!   
    11.        
      
  •   
  •     window.onload = function(){   
  •         var canvas = document.getElementById("canvas");   
  •         canvas.width = 800;   
  •         canvas.height = 600;   
  •         var context = canvas.getContext("2d");   
  •   
  •         var img = new Image();   
  •         img.src = "8-1.jpg";   
  •         img.onload = function(){   
  •             var pattern = context.createPattern(img, "repeat");   
  •             context.fillStyle = pattern;   
  •             context.fillRect(0,0,800,600);   
  •         }   
  •   
  •     }   
  •   
  •   
  •   
  • 运行结果:
    2016321113752010.jpg (850×500)

    这里使用了Image的onload事件,它的作用是对图片进行预加载处理,即在图片加载完成后才立即除非其后function的代码体。这个是必须的,如果不写的话,画布将会显示黑屏。因为没有等待图片加载完成就填充纹理,导致浏览器找不到图片。
    这里使用了"repeat",童鞋们也可尝试使用一下其他三个值,看看会有什么不同的效果。也可以自己找一下其他的图片尝试填充,看看效果。

    相关文章

    H5页面制作适合哪些应用场景

    H5页面制作如何进行测试

    H5页面制作的流程是怎样的

    H5页面制作能做什么

    H5页面制作是开发网页吗

    HTML速学教程(入门课程)
    HTML速学教程(入门课程)

    HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

    下载

    相关标签:

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    上一篇:html5 canvas移动浏览器上实现图片压缩上传_html5教程技巧 下一篇:HTML5实现多张图片上传功能_html5教程技巧

    热门AI工具

    更多

    相关专题

    更多
    Golang gRPC 服务开发与Protobuf实战
    Golang gRPC 服务开发与Protobuf实战

    本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

    8

    2026.01.15

    公务员递补名单公布时间 公务员递补要求
    公务员递补名单公布时间 公务员递补要求

    公务员递补名单公布时间不固定,通常在面试前,由招录单位(如国家知识产权局、海关等)发布,依据是原入围考生放弃资格,会按笔试成绩从高到低递补,递补考生需按公告要求限时确认并提交材料,及时参加面试/体检等后续环节。要求核心是按招录单位公告及时响应、提交材料(确认书、资格复审材料)并准时参加面试。

    44

    2026.01.15

    公务员调剂条件 2026调剂公告时间
    公务员调剂条件 2026调剂公告时间

    (一)符合拟调剂职位所要求的资格条件。 (二)公共科目笔试成绩同时达到拟调剂职位和原报考职位的合格分数线,且考试类别相同。 拟调剂职位设置了专业科目笔试条件的,专业科目笔试成绩还须同时达到合格分数线,且考试类别相同。 (三)未进入原报考职位面试人员名单。

    58

    2026.01.15

    国考成绩查询入口 国考分数公布时间2026
    国考成绩查询入口 国考分数公布时间2026

    笔试成绩查询入口已开通,考生可登录国家公务员局中央机关及其直属机构2026年度考试录用公务员专题网站http://bm.scs.gov.cn/pp/gkweb/core/web/ui/business/examResult/written_result.html,查询笔试成绩和合格分数线,点击“笔试成绩查询”按钮,凭借身份证及准考证进行查询。

    11

    2026.01.15

    Java 桌面应用开发(JavaFX 实战)
    Java 桌面应用开发(JavaFX 实战)

    本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

    65

    2026.01.14

    php与html混编教程大全
    php与html混编教程大全

    本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

    36

    2026.01.13

    PHP 高性能
    PHP 高性能

    本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

    75

    2026.01.13

    MySQL数据库报错常见问题及解决方法大全
    MySQL数据库报错常见问题及解决方法大全

    本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

    21

    2026.01.13

    PHP 文件上传
    PHP 文件上传

    本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

    35

    2026.01.13

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    相关下载

    更多

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    HTML5/CSS3/JavaScript/ES6入门课程
    HTML5/CSS3/JavaScript/ES6入门课程

    共102课时 | 6.7万人学习

    HTML+CSS基础与实战
    HTML+CSS基础与实战

    共132课时 | 9.5万人学习

    前端开发(基础+实战项目合集)
    前端开发(基础+实战项目合集)

    共60课时 | 3.8万人学习

    最新文章

    更多
    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号