程序员开发实例大全宝库

网站首页 > 编程文章 正文

HTML5实例005——像素风格头像生成器

zazugpt 2024-08-13 13:06:16 编程文章 24 ℃ 0 评论

前一篇里面的函数比较好的实现方式是:

function getIntRandom(alt, penSize) {
 return Math.floor(Math.random() * alt/penSize) * penSize;
}

先在一个范围内生成需要的数字,然后放大相应的倍数不就好了吗? 感谢大神,行家一出手,就知有没有,这是真真滴,在我用while去让计算机做重复计算的时候,动下脑子,用数学思维就可以轻松解决了呀。

继续实现那个画小正方形的东西吧,

1, 新建一个html,写入基础页面结构代码(为了等下方便解释,给前面手工加了行号,要复制使用的话,想办法把最前面的行号得取掉):

001 <!doctype html>
002 <html lang="zh">
003 <head>
004 <meta charset="UTF-8">
005 <title>像素风头像生成器</title>
006 </head>
007 <body>
008 <div id="wrapper">
009 <canvas id="myCanvas" width="200" height="200" style="border:1px solid #d3d3d3;">
010 Your browser does not support the HTML5 canvas tag.
011 </canvas>
012 <p>
013 <a href="javascript:;" id="mkephoto" onclick="makePhoto();">生成</a>
014 </p>
015 </div>
016 
017 
018 <style type="text/css" media="screen">
019 html {
020 margin: 0;
021 padding: 0;
022 font: 62.5%/1 Georgia, "Microsoft Yahei", sans-serif;
023 }
024 body {
025 font: 1.2/1.5;
026 }
027 
028 #wrapper {
029 margin: 5em auto;
030 text-align: center;
031 }
032 
033 .ctlArea{
034 text-align: center;
035 border: 1px dashed #c0c0c0;
036 border-radius: 4px;
037 }
038 
039 </style>
040 </body>
041 </html>

在第13行,给`<a>`标签加了`onclick`点击事件,直接调用`makePhoto`这个函数,接下来咱就去实现这个函数。

去行号的话,用正则表达式来可以:将`^\d\d\d `替换成没有就好了,再可以在列模式里面直接删除,放一张图吧,今天内容少,觉得编辑器好用的,去搜EverEdit,也可以给我私信,个人觉得在windows里面比sublime好使,关键对于编码这块支持很好(不是免费的)。

2, 在`</body>`前面直接写javascript部分:

039 </style>
040 
041 <script type="text/javascript">
042 
043 
044 function makePhoto () {
045 
046 var backColor = "transparent";
047 var imgWidth = 200;
048 var penSize = 40;
049 var penColor = "rgb("+getRemodInt(255)+","+getRemodInt(255)+","+getRemodInt(255)+")";
050 var c = document.getElementById("myCanvas");
051 
052 c.width = imgWidth;
053 c.height = imgWidth;
054 
055 var ctx=c.getContext("2d");
056 ctx.fillStyle="green";
057 //ctx.fillRect(40,0,10,10);
058 
059 // x从cab 0-50 取 值,再拿这个值取到对称数,
060 // y 从0 到 100 做10 次增加
061 
062 ctx.fillStyle = backColor;
063 //console.log(backColor);
064 ctx.fillRect(0, 0, imgWidth, imgWidth);
065 ctx.fillStyle = penColor;
066 for (var yl = 0; yl <= c.height; yl += penSize) {
067 (function(rmd){
068 console.log(rmd);
069 for (var i = 0; i < rmd; i++) {
070 var x1 = getRemodIntByPenSize(imgWidth , penSize);
071 ctx.fillRect(x1, yl, penSize, penSize);
072 //ctx.fillRect(x2, yl, penSize, penSize);
073 }
074 })(getRemodInt(imgWidth / penSize));
075 }
076 
077 }
078 
079 //返回一个在(0,Alt]区间的能被penSize整除的数
080 //确定具体亮哪几个像素
081 function getRemodIntByPenSize (alt, penSize) {
082 return Math.floor(Math.random() * alt / penSize) * penSize;
083 }
084 //返回指定范围以内的整数 传入3返回 132
085 //确定一行亮几个像素 
086 function getRemodInt(alt) {
087 return Math.floor(Math.random() * alt) + 1;
088 }
089 
090 makePhoto();
091 </script>
092 </body>

解释一下,

第44~77行是makePhoto函数,

46~49行定义了画布大小,背景颜色,像素大小,画笔颜色这些东西。

50行拿到了`canvas`,也就是画布,后面两行定义了画布的长宽。

62~64行把画布整个用背景色涂了一遍。

66~75行,用一个for循环确定要画的像素点的y坐标,就是一行一行地往下移动。

79~83行,84~88行的两个函数,一个负责确定这一行里面画出来几个像素,一个负责确定要画的这几个像素的x坐标放在哪。

67~74行,是一个闭包,确保每次循环过来的时候,内部执行的东西是一个独立的,不受上一次循环时候留下的一些变量影响。

69~73行,一个小循环,就是画一行的像素点,画几个由`rmd`这个值决定,`rmd`是要传入这个闭包函数的值,在74行调用的时候用`getRemodInt(imgWidth / penSize)`给算出来传了进去。(这里如果不懂的话,没关系,只要知道这个东西是个闭包,有兴趣的话,可以去搜索学习一下)

就这些了,先设法看到效果再说,不要怕里面不懂的地方。(高能预警)个人觉得哈,学编程就得拿来先用,先试试再说,然后再给解剖了,看看具体是怎么个实现的,用到了哪些知识点,再一个个小知识点地去把它给理解,化为已用,所以,不要觉得有一个地方不懂或者做不出来的时候,就放手,及时搜索,及时求助,及时尝试。和小孩子学说话一样,刚开始总会跑音,太正常了,学习本身就是一点点积累的过程。

就这样。效果图再来一张,不然没法放封面呀。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表