【Canvas与艺术】绘制磨砂黄铜材质Premium Quality徽章

【关键点】

渐变色的使用、斜纹的实现、底图的寻觅

【成果图】

​​​​​​​

【代码】

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head><title>磨砂黄铜材质Premium Quality徽章</title><style type="text/css">.centerlize{margin:0 auto;width:1200px;}</style></head><body onload="init();"><div class="centerlize"><canvas id="myCanvas" width="12px" height="12px" style="border:1px dotted black;">如果看到这段文字说您的浏览器尚不支持HTML5 Canvas,请更换浏览器再试.</canvas><img id="myImg" src="124.jpg" style="display:none;"/></div></body>
</html>
<script type="text/javascript">
<!--
/*****************************************************************
* 将全体代码(从<!DOCTYPE到script>)拷贝下来,粘贴到文本编辑器中,
* 另存为.html文件,再用chrome浏览器打开,就能看到实现效果。
******************************************************************/// canvas的绘图环境
var ctx;// 高宽
const WIDTH=512;
const HEIGHT=512;// 舞台对象
var stage;//-------------------------------
// 初始化
//-------------------------------
function init(){// 获得canvas对象var canvas=document.getElementById('myCanvas');  canvas.width=WIDTH;canvas.height=HEIGHT;// 初始化canvas的绘图环境ctx=canvas.getContext('2d');  ctx.translate(WIDTH/2,HEIGHT/2);// 原点平移到画布中央// 准备stage=new Stage();	stage.init();// 开幕animate();
}// 播放动画
function animate(){    stage.update();	stage.paintBg(ctx);stage.paintFg(ctx);	 // 循环if(true){window.requestAnimationFrame(animate);   }
}// 舞台类
function Stage(){// 初始化this.init=function(){}// 更新this.update=function(){}// 画背景this.paintBg=function(ctx){ctx.clearRect(-WIDTH/2,-HEIGHT/2,WIDTH,HEIGHT);// 清屏	// 底色var lgrd=ctx.createLinearGradient(-WIDTH/2,-HEIGHT/2,WIDTH,HEIGHT);lgrd.addColorStop(0,"rgba(168,159,154,0.8)");lgrd.addColorStop(0.28,"rgba(7,12,41,0.8)");lgrd.addColorStop(1,"rgba(7,12,41,0.8)");ctx.fillStyle=lgrd;ctx.fillRect(-WIDTH/2,-HEIGHT/2,WIDTH,HEIGHT);// 斜向条纹ctx.save();ctx.rotate(Math.PI/6);for(var i=0;i<100;i++){var y=-HEIGHT+i*10;ctx.beginPath();// 不加此句线条粗劣ctx.moveTo(-WIDTH,y);ctx.lineTo(WIDTH,y);ctx.lineWidth=0.2;var lgrd=ctx.createLinearGradient(-WIDTH,y,WIDTH,y);lgrd.addColorStop(0,"rgb(250,250,250)");lgrd.addColorStop(1,"rgb(7,12,41)");ctx.strokeStyle=lgrd;ctx.stroke();}ctx.restore();// 外缘var arr=createWaveCircleArray(48,141,12);ctx.beginPath();for(var j=0;j<arr.length-2;j+=2){var pt1=arr[j];var pt2=arr[j+1];// 控制点var pt3=arr[j+2];			ctx.lineTo(pt1.x,pt1.y);ctx.quadraticCurveTo(pt2.x,pt2.y,pt3.x,pt3.y);}ctx.closePath();ctx.strokeStyle="rgb(231,170,79)";ctx.stroke();// 铜底图ctx.save();var arr=createWaveCircleArray(48,140,12);ctx.beginPath();for(var j=0;j<arr.length-2;j+=2){var pt1=arr[j];var pt2=arr[j+1];// 控制点var pt3=arr[j+2];			ctx.lineTo(pt1.x,pt1.y);ctx.quadraticCurveTo(pt2.x,pt2.y,pt3.x,pt3.y);}ctx.closePath();ctx.clip();var img=document.getElementById("myImg");ctx.drawImage(img,0,0,320,320,-160,-160,320,320);ctx.restore();// 暗圈ctx.beginPath();ctx.arc(0,0,122,0,Math.PI*2,true);ctx.closePath();ctx.lineWidth=1;ctx.strokeStyle="rgb(229,174,94)";ctx.stroke();// 蓝圈ctx.beginPath();ctx.arc(0,0,120,0,Math.PI*2,true);ctx.closePath();ctx.lineWidth=2;ctx.strokeStyle="rgb(19,28,57)";ctx.stroke();// 亮圈ctx.beginPath();ctx.arc(0,0,118,0,Math.PI*2,true);ctx.closePath();ctx.lineWidth=1;ctx.strokeStyle="rgb(231,170,79)";ctx.stroke();// 上半圈文字var words="PREMIUM QUALITY";var arr=words.split("");for(var i=0;i<arr.length;i++){var letter=arr[i];var theta=i*Math.PI/180*8.5+Math.PI+Math.PI/180*34;var x=84*Math.cos(theta);var y=84*Math.sin(theta);ctx.save();ctx.translate(x,y);ctx.rotate(theta+Math.PI/2);ctx.scale(1,1.2);ctx.textBaseline="bottom";ctx.textAlign="center";ctx.font = "20px Stencil Std";ctx.fillStyle="rgb(19,28,57)";ctx.fillText(letter,0,0);ctx.restore();}// 下半圈文字var words="PREMIUM QUALITY";var arr=words.split("");for(var i=0;i<arr.length;i++){var letter=arr[i];var theta=-i*Math.PI/180*8.5+Math.PI-Math.PI/180*28;var x=113*Math.cos(theta);var y=113*Math.sin(theta);ctx.save();ctx.translate(x,y);ctx.rotate(theta-Math.PI/2);ctx.scale(1,1.2);ctx.textBaseline="bottom";ctx.textAlign="center";ctx.font = "20px Stencil Std";ctx.fillStyle="rgb(19,28,57)";ctx.fillText(letter,0,0);ctx.restore();}draw5Star(ctx,-100,0,13,"rgb(19,28,57)");draw5Star(ctx, 100,0,13,"rgb(19,28,57)");// 蓝圈ctx.beginPath();ctx.arc(0,0,80,0,Math.PI*2,true);ctx.closePath();ctx.lineWidth=1;ctx.strokeStyle="rgb(19,28,57)";ctx.stroke();// 亮圈ctx.beginPath();ctx.arc(0,0,80.5,0,Math.PI*2,true);ctx.closePath();ctx.lineWidth=0.5;ctx.strokeStyle="rgb(231,170,79)";ctx.stroke();// 中心文字ctx.textBaseline="bottom";ctx.textAlign="center";		ctx.fillStyle="rgb(19,28,57)";	ctx.font = "36px Ink Free";// 手写字体ctx.fillText("BEST",0,-10);// 加两根俏皮的横线ctx.beginPath();ctx.moveTo(-40,-10);ctx.lineTo(40,-15);ctx.lineWidth=0.8;ctx.strokeStyle="rgb(19,28,57)";ctx.stroke();ctx.beginPath();ctx.moveTo(-32,-8);ctx.lineTo(38,-11);ctx.lineWidth=0.5;ctx.strokeStyle="rgb(19,28,57)";ctx.stroke();// 正规字体ctx.font = "36px Bahnschrift SemiBold";ctx.fillText("CHOICE",0,40);// 作者ctx.textBaseline="bottom";ctx.textAlign="center";ctx.font = "8px consolas";ctx.fillStyle="white";ctx.fillText("逆火原创",WIDTH/2-40,HEIGHT/2-10);}// 画前景this.paintFg=function(ctx){}
}//--------------------------------------------------
// 函数:创建波浪式环形需要的数组
// n:浪头峰谷个数
// radius:环形半径
// waveHeight:浪高
// 返回:包含浪高中低点坐标的数组
//--------------------------------------------------
function createWaveCircleArray(n,radius,waveHeight){var arr=[];const LEN=n+2;// 数组长度比浪头峰谷数多两个以在绘图时形成闭环	for(var i=0;i<LEN;i++){var theta=i*Math.PI*2/n;var r=radius+Math.sin(Math.PI/2*i)*waveHeight;// 造成涨落var pt={};pt.x=r*Math.cos(theta);pt.y=r*Math.sin(theta);arr.push(pt);}return arr;
}// 画实心五角星的函数
function draw5Star(ctx,x,y,r,color){ctx.save()ctx.translate(x-r,y-r);    ctx.beginPath();ctx.moveTo(r, 0);ctx.lineTo(r+Math.cos(Math.PI*3/10)*r, r+Math.sin(Math.PI*3/10)*r);ctx.lineTo(r-Math.cos(Math.PI*1/10)*r, r-Math.sin(Math.PI*1/10)*r);ctx.lineTo(r+Math.cos(Math.PI*1/10)*r, r-Math.sin(Math.PI*1/10)*r);ctx.lineTo(r-Math.cos(Math.PI*3/10)*r, r+Math.sin(Math.PI*3/10)*r);ctx.lineTo(r, 0);ctx.closePath();ctx.fillStyle=color;ctx.fill();ctx.restore();
}/*---------------------------------------------
如果动物吃不胖,它肚子里一定有寄生虫;
如果百姓勤劳而不能致富,那社会里一定有寄生虫!
----------------------------------------------*/
//-->
</script>

【底图】

上文用到的底图 124.jpg

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/818993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络:数据链路层 - CSMA/CA协议

计算机网络&#xff1a;数据链路层 - CSMA/CA协议 CSMA/CA概述帧间间隔工作原理退避算法虚拟载波监听 CSMA/CA概述 讲解CSMA/CA之前&#xff0c;我们回顾一下CSMA/CD的三个特性&#xff1a; 多址接入MA&#xff1a;多个主机连接在一条总线上&#xff0c;竞争使用总线 载波监听…

腾讯云轻量应用服务器端口开启教程

腾讯云轻量应用服务器端口怎么打开&#xff1f;在轻量应用服务器控制台的防火墙中开启端口&#xff0c;本文腾讯云百科txybk.com以80端口为例&#xff0c;来详细说下轻量应用服务器端口打开教程&#xff0c;另外可以在腾讯云百科 txy.wiki 查看当前轻量服务器最新的优惠券和配置…

大隐市苏州

大隐隐于市的典型&#xff1a;苏州。 中国四大园林&#xff0c;二个在苏州&#xff0c;实际上看多逛多了苏州园林&#xff0c;其它地方的园林真的就是太不精致了~~~~ 哈哈&#xff0c;莫打莫打。 将山水装入庭院&#xff0c;情怀显露山水间。 看似宅男一个&#xff0c;实则依旧…

康耐视visionpro-CoglntersectLineLineTool操作说明工具详细说明

◆CogIntersectLineLineTool功能说明&#xff1a; 创建两条线的交点 备注&#xff1a;在“Geometry-Intersection”选项中的所有工具都是创建两个图形的交点工具&#xff0c;其中包括圆与圆的交点、线与圆的交点、线与线的交点、线与圆的交点等&#xff0c;工具使用的方法相似。…

视频国标学习

总体介绍 GB/T28181协议&#xff0c;全名叫《安全防范视频监控联网系统信息传输、交换、控制技术要求》&#xff0c;是由中国国家标准委员会发布的一种国家级的标准。它主要对视频监控系统的各个方面做了明确的规定&#xff0c;使得不同厂商生产的视频监控设备能够相互连通&am…

一种基于OpenCV的图片倾斜矫正方法

需求描述&#xff1a; 对倾斜的图片进行矫正&#xff0c;返回倾斜角度和矫正后的图片。 解决方法&#xff1a; 1、各种角度点被投影到一个累加器阵列中&#xff0c;其中倾斜角度可以定义为在最大化对齐的搜索间隔内的投影角度。 2、以不同的角度旋转图像&#xff0c;并为每…

参会记录|全国多媒体取证暨第三届多媒体智能安全学术研讨会(MAS‘2024)

前言&#xff1a;2024年4月13日上午&#xff0c;我与实验室的诸位伙伴共聚江西南昌的玉泉岛大酒店&#xff0c;参加了为期一天半的全国多媒体取证暨第三届多媒体智能安全学术研讨会&#xff08;MAS’2024&#xff09;。本届学术研讨会由江西省计算机学会、江西省数字经济学会主…

PHP:IntelliJ IDEA 配置 PHP 开发环境及导入PHP项目

在创建PHP项目之前我们需要安装PHP插件&#xff0c;安装步骤如下&#xff1a;Windows&#xff1a;IntelliJ IDEA Ultimate 安装 PHP 插件-CSDN博客 1、导入已有PHP项目&#xff0c;导入之后选择&#xff0c;File > Setting 选择对应 CLL Interpreter&#xff0c;如果没有操…

GitHub登录收不到邮箱验证码

由于长时间没有登录GitHub&#xff0c;浏览器可能清除了相应的cookie信息&#xff0c;所以需要对应绑定邮箱进行验证&#xff0c;但因为邮箱长时间没有收到验证码&#xff0c;所以给到以下一种可能解决的方法&#xff1a; 需要输入验证码进行验证 我们可以打开QQ邮箱&#xff0…

java的深入探究JVM之类加载与双亲委派机制

前言 前面学习了虚拟机的内存结构、对象的分配和创建&#xff0c;但对象所对应的类是怎么加载到虚拟机中来的呢&#xff1f;加载过程中需要做些什么&#xff1f;什么是双亲委派机制以及为什么要打破双亲委派机制&#xff1f; 类的生命周期 类的生命周期包含了如上的7个阶段&a…

光场相机建模与畸变校正改进方法

摘要&#xff1a;光场相机作为一种新型的成像系统&#xff0c;可以直接从一次曝光的图像中得到三维信息。为了能够更充分有效地利用光场数据包含的角度和位置信息&#xff0c;完成更加精准的场景深度计算&#xff0c;从而提升光场相机的三维重建的精度&#xff0c;需要实现精确…

比特币突然暴跌

作者&#xff1a;秦晋 周末愉快。 今天给大家分享两则比特币新闻&#xff0c;也是两个数据。一则是因为中东地缘政治升温&#xff0c;传统资本市场的风险情绪蔓延至加密市场&#xff0c;引发加密市场暴跌。比特币跌至66000美元下方。杠杆清算金额高达8.5亿美元。 二则是&#x…

Spring(24) Json序列化的三种方式(Jackson、FastJSON、Gson)史上最全!

目录 一、Jackson 方案&#xff08;SpringBoot默认支持&#xff09;1.1 Jackson 库的特点1.2 Jackson 的核心模块1.3 Maven依赖1.4 代码示例1.5 LocalDateTime 格式化1.6 统一配置1.7 常用注解1.8 自定义序列化和反序列化1.9 Jackson 工具类 二、FastJSON 方案2.1 FastJSON 的特…

Redis消息队列-基于PubSub的消息队列

7.3 Redis消息队列-基于PubSub的消息队列 PubSub&#xff08;发布订阅&#xff09;是Redis2.0版本引入的消息传递模型。顾名思义&#xff0c;消费者可以订阅一个或多个channel&#xff0c;生产者向对应channel发送消息后&#xff0c;所有订阅者都能收到相关消息。 SUBSCRIBE …

【练习】二分查找

1、704 &#xff08;1&#xff09;题目描述 &#xff08;2&#xff09;代码实现 package com.hh.practice.leetcode.array.demo_02;public class BinarySearch_704 {public int search(int[] nums, int target) {int i 0,j nums.length -1;while (i < j){int mid (ij) &…

【QT+QGIS跨平台编译】181:【QGIS+Qt跨平台编译】—【错误处理:找不到_DEBUGA】

点击查看专栏目录 文章目录 一、找不到_DEBUGA二、原因分析三、错误处理 一、找不到_DEBUGA 报错信息&#xff1a; 二、原因分析 采用了非UNICODE&#xff1a; DEFINES - UNICODE没法识别 _DEBUGA 但可以识别 _DEBUG 三、错误处理 修改 _DEBUGA 为 _DEBUG

C语言专项训练

道阻且长&#xff0c;接下来就要开始数据结构的学习&#xff0c;而学不可以不练&#xff0c;在接下来的学习中&#xff0c;数据结构学习的同时&#xff0c;c语言训练也要开始更新了&#xff5e; NO.1 函数 1.void函数声明 这道题一看就秒了(开玩笑)我们在知道答案的同时&#…

Linux多进程开发2 - 进程间通信

1、进程间通信的概念 进程是一个独立的资源分配单元&#xff0c;不同进程之间的资源是独立的&#xff0c;没有关联&#xff0c;不能在一个进程中直接访问另一个进程的资源。但是&#xff0c;进程不是孤立的&#xff0c;不同的进程需要进行信息的交换和状态的传递等&…

【YOLOV5 入门】——Pyside6/PyQt5可视化UI界面后端逻辑

声明&#xff1a;笔记是做项目时根据B站博主视频学习时自己编写&#xff0c;请勿随意转载&#xff01; 一、环境安装 VScode/Pycharm终端进入虚拟环境后&#xff0c;输入下面代码安装pyside6&#xff0c;若用的Pycharm作为集成开发环境&#xff0c;也下载个pyqt5&#xff1a; …

得物 Zookeeper SLA 也可以 99.99% | 得物技术

一、背景 ZooKeeper&#xff08;ZK&#xff09;是一个诞生于2007年的分布式应用程序协调服务。尽管出于一些特殊的历史原因&#xff0c;许多业务场景仍然不得不依赖它。比如&#xff0c;Kafka、任务调度等。特别是在 Flink 混合部署 ETCD 解耦 时&#xff0c;业务方曾要求绝对…