搜索
首页web前端H5教程使用HTML5 Canvas为图片填充颜色和纹理的教程_html5教程技巧

填充颜色

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

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.        
  
  •   
  • <script> </script>
  •     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等绘图工具,用过其中的渐变色设置,应该会很好理解。
    这里渐变线的起点和终点不一定要在图像内,颜色断点的位置也是一样的。但是如果图像的范围大于渐变线,那么在渐变线范围之外,就会自动填充离端点最近的断点的颜色。
    这里配合两个补充函数再举一例。

    绘制矩形的快捷方法

    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.        
      
  •   
  • <script> </script>
  •     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.        
      
  •   
  • <script> </script>
  •     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.        
      
  •   
  • <script> </script>
  •     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",童鞋们也可尝试使用一下其他三个值,看看会有什么不同的效果。也可以自己找一下其他的图片尝试填充,看看效果。

    声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    H5:网络标准和技术的发展H5:网络标准和技术的发展Apr 15, 2025 am 12:12 AM

    Web标准和技术从HTML4、CSS2和简单的JavaScript演变至今,经历了显着的发展。 1)HTML5引入了Canvas、WebStorage等API,增强了Web应用的复杂性和互动性。 2)CSS3增加了动画和过渡功能,使页面效果更加丰富。 3)JavaScript通过Node.js和ES6的现代化语法,如箭头函数和类,提升了开发效率和代码可读性,这些变化推动了Web应用的性能优化和最佳实践的发展。

    H5是HTML5的速记吗?探索细节H5是HTML5的速记吗?探索细节Apr 14, 2025 am 12:05 AM

    H5不仅仅是HTML5的简称,它代表了一个更广泛的现代网页开发技术生态:1.H5包括HTML5、CSS3、JavaScript及相关API和技术;2.它提供更丰富、互动、流畅的用户体验,能在多设备上无缝运行;3.使用H5技术栈可以创建响应式网页和复杂交互功能。

    H5和HTML5:网络开发中常用的术语H5和HTML5:网络开发中常用的术语Apr 13, 2025 am 12:01 AM

    H5与HTML5指的是同一个东西,即HTML5。HTML5是HTML的第五个版本,带来了语义化标签、多媒体支持、画布与图形、离线存储与本地存储等新功能,提升了网页的表现力和交互性。

    H5指的是什么?探索上下文H5指的是什么?探索上下文Apr 12, 2025 am 12:03 AM

    H5referstoHTML5,apivotaltechnologyinwebdevelopment.1)HTML5introducesnewelementsandAPIsforrich,dynamicwebapplications.2)Itsupportsmultimediawithoutplugins,enhancinguserexperienceacrossdevices.3)SemanticelementsimprovecontentstructureandSEO.4)H5'srespo

    H5:工具,框架和最佳实践H5:工具,框架和最佳实践Apr 11, 2025 am 12:11 AM

    H5开发需要掌握的工具和框架包括Vue.js、React和Webpack。1.Vue.js适用于构建用户界面,支持组件化开发。2.React通过虚拟DOM优化页面渲染,适合复杂应用。3.Webpack用于模块打包,优化资源加载。

    HTML5的遗产:当前了解H5HTML5的遗产:当前了解H5Apr 10, 2025 am 09:28 AM

    HTML5hassignificantlytransformedwebdevelopmentbyintroducingsemanticelements,enhancingmultimediasupport,andimprovingperformance.1)ItmadewebsitesmoreaccessibleandSEO-friendlywithsemanticelementslike,,and.2)HTML5introducednativeandtags,eliminatingthenee

    H5代码:可访问性和语义HTMLH5代码:可访问性和语义HTMLApr 09, 2025 am 12:05 AM

    H5通过语义化元素和ARIA属性提升网页的可访问性和SEO效果。1.使用、、等元素组织内容结构,提高SEO。2.ARIA属性如aria-label增强可访问性,辅助技术用户可顺利使用网页。

    H5与HTML5相同吗?H5与HTML5相同吗?Apr 08, 2025 am 12:16 AM

    "h5"和"HTML5"在大多数情况下是相同的,但它们在某些特定场景下可能有不同的含义。1."HTML5"是W3C定义的标准,包含新标签和API。2."h5"通常是HTML5的简称,但在移动开发中可能指基于HTML5的框架。理解这些区别有助于在项目中准确使用这些术语。

    See all articles

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    AI Hentai Generator

    AI Hentai Generator

    免费生成ai无尽的。

    热门文章

    R.E.P.O.能量晶体解释及其做什么(黄色晶体)
    4 周前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.最佳图形设置
    4 周前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.如果您听不到任何人,如何修复音频
    4 周前By尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25:如何解锁Myrise中的所有内容
    1 个月前By尊渡假赌尊渡假赌尊渡假赌

    热工具

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    SecLists

    SecLists

    SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

    Dreamweaver Mac版

    Dreamweaver Mac版

    视觉化网页开发工具

    PhpStorm Mac 版本

    PhpStorm Mac 版本

    最新(2018.2.1 )专业的PHP集成开发工具