「振兴中华,乃我辈之责」于75周年校庆使用 canvas 纪念黄大年老师🕯️

2,326 阅读2分钟

大家好,我是寒草😈,一只草系码猿🐒。间歇性热血🔥,持续性沙雕🌟
如果喜欢我的文章,可以关注➕ 点赞,与我一同成长吧~

前言

效果如头图,本文严肃

我是寒草,去年毕业的吉大计算机院本科生,因为疫情原因,没有一个很有仪式感的毕业典礼🎓,实属可惜,也算是我长久以来的遗憾,加上在学校上学时也经常听到黄大年老师的事迹,很受感触。

所以我发此文并出几年作品,主题有二:

  • 母校 75 周年生日快乐
  • 作为一个前端,用我的方式纪念黄大年老师

image.png

振兴中华,乃我辈之责”这句话最开始我看到的时候属于震撼到了我,就像儿时的我看到周总理的“为中华之崛起而读书”,心潮澎湃。

我不在此多赘述黄大年的事迹了,如果大家感兴趣可以去自行查阅资料。

设计

这个设计其实很难做,我想要的几个元素是:

  • 振兴中华,乃我辈之责
  • 母校标志性建筑
  • 校徽

代码实现

先是找图片资源,可惜网上没找到什么合适的照片,只有一个带有招生信息的图片,为了不影响大家阅读体验,我就给裁掉了,大家想象一下图片本来的样子吧。

image.png

没办法,我自己处理呗,也没事的~

需要处理的点是:

  • 白天变成黑夜
  • 去掉多余的东西(文字,白云)
  • 天空中显示振兴中华,乃我辈之责这句话
  • 展示校徽

之后就有了下面的代码,本文更多是纪念意义,实现我就少讲了,抱歉

代码写的不好,但是还是贴给大家

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>line-art</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    .image {
      position: absolute;
      z-index: 999;
      top: 0;
      left: 0;
      opacity: 0;
      transition: 4s ease all;
    }
  </style>
</head>

<body>
  <canvas id="my-canvas"></canvas>
  <script>
    const imageUrl = "jida.jpg";
    let myCanvas = document.getElementById("my-canvas");
    let cxt = myCanvas.getContext("2d");

    const jidaImage = new Image();
    jidaImage.src = "logo.png";
    jidaImage.onload = (ev) => {

      let { height, width } = ev.path[0];
      jidaImage.width = width;
      jidaImage.height = height;
      myCanvas.width = width;
      myCanvas.height = height;
      cxt.drawImage(jidaImage, 0, 0);
      let imageData = cxt.getImageData(0, 0, width, height).data;
      let list2 = [];
      for (let h = 0; h < height; h += 1) {
        for (let w = 0; w < width; w += 1) {
          let position = (width * h + w) * 4;
          let r = imageData[position], g = imageData[position + 1], b = imageData[position + 2], a = imageData[position + 3];
          if (r + g + b < 700) {
            list2.push({
              h: h + 180,
              w: w + 800
            })
          }
        }
      }

      const image = new Image();
      image.src = 'huangdanian.jpeg';
      image.onload = (ev) => {
        let { height, width } = ev.path[0];
        image.width = width;
        image.height = height;
        myCanvas.width = width;
        myCanvas.height = height;
        cxt.drawImage(image, 0, 0);
        let imageData = cxt.getImageData(0, 0, width, height).data;
        let list = [];
        for (let h = 0; h < height / 2; h += 1) {
          for (let w = 0; w < width; w += 1) {
            let position = (width * h + w) * 4;
            let r = imageData[position], g = imageData[position + 1], b = imageData[position + 2], a = imageData[position + 3];
            if (r + g + b < 700) {
              list.push({
                h: h + 200,
                w: w + 1300
              })
            }
          }
        }
        const natuImage = new Image();
        natuImage.src = imageUrl;
        natuImage.onload = (ev) => {
          let { height, width } = ev.path[0];
          natuImage.width = width;
          natuImage.height = height;
          myCanvas.width = width;
          myCanvas.height = height;
          cxt.drawImage(natuImage, 0, 0);
          let imageData = cxt.getImageData(0, 0, width, height).data;
          const hStart = Math.floor(height * 2 / 5);
          for (let h = 0; h < height; h += 1) {
            for (let w = 0; w < width; w += 1) {
              let position = (width * h + w) * 4;
              let r = imageData[position], g = imageData[position + 1], b = imageData[position + 2], a = imageData[position + 3];
              const random = Math.random();
              if (h > hStart && r + g + b < 420) {
                cxt.fillStyle = `rgba(${r - 60}, ${g - 60}, ${b - 60}, 1)`;
                cxt.fillRect(w, h, 1, 1);
              } else {
                if (random < 0.0001 && h <= hStart) {
                  cxt.fillStyle = `rgba(248, 236, 167, 1)`;
                  cxt.fillRect(w, h, 1, 1);
                } else {
                  cxt.fillStyle = `rgba(0, ${20 - Math.floor(20 * h / height)}, ${50 - Math.floor(50 * h / height)}, 1)`;
                  cxt.fillRect(w, h, 1, 1);
                }
              }
            }
          }

          for (const item of list) {
            cxt.fillStyle = `rgba(248, 236, 167, 0.6)`;
            cxt.fillRect(item.w, item.h, 1, 1);
          }

          for (const item of list2) {
            cxt.fillStyle = `rgba(248, 236, 167, 0.6)`;
            cxt.fillRect(item.w, item.h, 1, 1);
          }

        }
      }
    }
  </script>
</body>

</html>

结束语

image.png

上图为地质宫

前行是最好的怀念
我辈吉人
继续努力

前辈毕业时留下的“振兴中华,乃我辈之责”给我们无限的激励,在此,我也留下一句:

求实创新,励志图强,乃我辈吉人之风采。

愿激情热血长存,同时也祝愿母校75岁生日快乐,感谢大家阅读。