【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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

若依Vue3:新一代前后端分离权限管理系统

随着技术的不断进步&#xff0c;前后端分离的开发模式逐渐成为主流&#xff0c;特别是在构建权限管理系统时。在这样的背景下&#xff0c;若依Vue3应运而生&#xff0c;作为基于Spring Boot、Spring Security、JWT、Vue3、Vite和Element Plus的全新解决方案&#xff0c;它在技术…

Ubuntu20.04安装ROS过程记录以及常见报错处理

sudo sh -c ‘echo “deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main” > /etc/apt/sources.list.d/ros-latest.list’ sudo apt-key adv --keyserver ‘hkp://keyserver.ubuntu.com:80’ --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt-…

linux启动流程(s3c2400)

概述 大致流程&#xff1a;内核&#xff08;kernel&#xff09;都是由bootloader程序引导启动的&#xff0c;所以我们应该先烧进去bootloader程序。然后可以通过保存的内核代码或者通过远程连接&#xff08;nfs/tftp&#xff09;的主机下载再运行&#xff0c;再挂载根文件系统。…

ABAP 前导0的处理

前导0这个东西真的很烦&#xff0c;经常因为前导0导致连接条件有问题&#xff0c;出不来数据&#xff0c;这里就总结一下前导0 在sql语句中的添加和去除 文章目录 ABAP 前导0的处理添加前导0-自适应运行结果 去除前导0方法一、使用SUBSTRING截取运行结果 方法二、去零法运行结…

小白新手学习 Python 使用哪个 Linux 系统更好?

对于小白新手学习Python&#xff0c;选择哪个Linux系统是一个很重要的问题&#xff0c;因为不同的Linux发行版&#xff08;distribution&#xff09;有着不同的特点、优势和适用场景。在选择时&#xff0c;需要考虑到易用性、学习曲线、社区支持等因素。 Ubuntu Ubuntu 是一个…

【AcWing】蓝桥杯集训每日一题Day16|哈希|FloodFill算法|字典序最小|映射|1402.星空之夜(C++)

1402.星空之夜 1402. 星空之夜 - AcWing题库难度&#xff1a;中等时/空限制&#xff1a;1s / 64MB总通过数&#xff1a;3415总尝试数&#xff1a;7434来源&#xff1a;usaco training 5.1算法标签Flood Fill哈希DFSBFS 题目内容 夜空深处&#xff0c;闪亮的星星以星群的形式出…

Spring Cloud系列(二):Eureka Server应用

系列文章 Spring Cloud系列(一)&#xff1a;Spirng Cloud变化 Spring Cloud系列(二)&#xff1a;Eureka Server应用 目录 前言 注册中心对比 Nacos Zookeeper Consul 搭建服务 准备 搭建 搭建父模块 搭建Server模块 启动服务 测试 其他 前言 前面针对新版本的变化有了…

Linux--进程的概念(二)

目录 一、进程的优先级1.1 基本概念1.2 查看进程优先级1.3 PRI&NI1.4 如何更改进程的优先级1.4.1 用top命令更改进程的nice1.4.2 用renice命令更改进程的nice 1.5 其他概念 二、环境变量2.1 基本概念2.2 常见的环境变量2.3 查看环境变量2.3.1 测试PATH2.3.2 测试HOME2.3.3 …

安全操作代码优化思路

理论依据 数据增强和样本选择 在训练阶段&#xff0c;您可以考虑添加数据增强来提升模型的鲁棒性和泛化能力。针对人脸检测任务&#xff0c;可以尝试以下改进&#xff1a; 对输入图像进行随机裁剪、缩放、旋转、翻转等数据增强操作&#xff0c;以增加数据的多样性。 使用难样…

【堡垒机】堡垒机的介绍

目前&#xff0c;常用的堡垒机有收费和开源两类。 收费的有行云管家、纽盾堡垒机&#xff1b; 开源的有jumpserver&#xff1b; 这几种各有各的优缺点&#xff0c;如何选择&#xff0c;大家可以根据实际场景来判断 什么是堡垒机 堡垒机&#xff0c;即在一个特定的网络环境下&…

革命性突破:Stability AI发布全新12B参数Stable LM 2模型,颠覆AI界!

Stability AI已推出其Stable LM 2语言模型系列的最新成员&#xff1a;一个120亿参数的基础模型和一个经过指令调优的变体。这些模型在七种语言上训练&#xff0c;包括英语、西班牙语、德语、意大利语、法语、葡萄牙语和荷兰语&#xff0c;训练数据达到了令人印象深刻的两万亿个…

JavaScript(1)神秘的编程技巧

大家都感兴趣的箭头函数 箭头函数在许多场景中都可以发挥作用&#xff0c;尤其适用于简化函数声明和提高代码的可读性。以下是箭头函数可以使用的一些常见方面&#xff1a; &#xff08;1&#xff09;回调函数&#xff1a; 箭头函数特别适合作为回调函数&#xff0c;例如在事…

【教程】App打包成IPA文件类型的四种方法

摘要 本教程总结了将App应用程序打包为IPA包的四种常用方法&#xff0c;包括Apple推荐的方式、iTunes拖入方法、自动编译脚本和解压改后缀名方法。每种方法都有其特点和适用场景&#xff0c;在实际开发中可以根据需求选择合适的方式进行打包。通过本教程&#xff0c;您将了解到…

微服务(狂神)

什么是微服务&#xff1a; 微服务方案&#xff1a; 1. SpringCloud NetFlix 2. Dubbo 3. SpringCloud Alibaba 解决了什么问题&#xff1a; 1. 服务过多&#xff0c;客户端怎么访问 2. 服务过多&#xff0c;服务间怎么传值 3. 服务过多&#xff0c;如何治理 4. 服务过多…

【随笔】Git 高级篇 -- 最近标签距离查询 git describe(二十一)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

JVM基础第一篇

内存结构 程序计数器 1.定义 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;每个线程都有一个独立的程序计数器&#xff0c;它是线程私有的&#xff0c;不会被线程切换所影响。 2.作用 记住下一条jvm指令的执行地址 3.特点 是线程私有的不会存在内存溢出 虚拟机…

nginx配置证书和私钥进行SSL通信验证

文章目录 一、背景1.1 秘钥和证书是两个东西吗&#xff1f;1.2 介绍下nginx配置文件中参数ssl_certificate和ssl_certificate_key1.3介绍下nginx支持的证书类型1.4 目前nginx支持哪种证书格式&#xff1f;1.5 nginx修改配置文件目前方式也会有所不同1.6 介绍下不通格式的证书哪…

【DM8】序列

创建序列 图形化界面创建 DDL CREATE SEQUENCE "TEST"."S1" INCREMENT BY 1 START WITH 1 MAXVALUE 100 MINVALUE 1;参数&#xff1a; INCREMENT BY < 增量值 >| START WITH < 初值 >| MAXVALUE < 最大值 >| MINVALUE < 最小值…

Proxmox VE qm 方式一键创建Windows虚拟机

前言 实现qm 方式一键创建Windows虚拟机&#xff0c;提高效率。 qm 一键创建Windows虚拟机 以下实现在线下载镜像&#xff0c;创建虚拟机&#xff0c;安装系统需要自己手动安装哦&#xff0c;如果想实现全自动安装系统&#xff0c;建议部署自己的内网pxe server 系统参考各参…

Utilize webcam to capture photo with camera

1. Official Guide& my github Official course my github 2. Overcome Webcam js Error in Chrome: Could not access webcam link 直接把代码拷贝到本机的下述目录下 To ignore Chrome’s secure origin policy, follow these steps. Navigate to chrome://flags/#un…