前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >复刻画龙产品之新春气泡兔

复刻画龙产品之新春气泡兔

作者头像
前端小鑫同学
发布2023-02-03 14:38:37
2810
发布2023-02-03 14:38:37
举报

我正在参加「兔了个兔」创意投稿大赛,详情请看:「兔了个兔」创意投稿大赛

🎄Hi~ 大家好,我是小鑫同学,一位长期从事前端开发的编程爱好者,我将使用更为实用的案例输出更多的编程知识,同时我信奉分享是成长的唯一捷径,在这里也希望我的每一篇文章都能成为你技术落地的参考~

🚀技术&代码分享

  • 我在 IT200 总结技术学习;
  • 我在 1024Code 在线编写代码;
  • 我在 掘金 分享技术文章;
  • 我在 Github 参与开源学习;

😇推荐几个好用的工具

进入正题

复刻掘金一篇画龙的文章,在兔年春节来临之际献上一幅新春气泡兔,创意虽旧但技术永存,本节案例代码已上传1024Code - 让编程重回乐趣,在线协作编写代码更轻松。

剪影图:

1. 初始化容器

通过 PIXI 中的 Application 对象初始化一个宽600、高1000、白色背景的容器,并通过appendChild添加到当前组件的模板中:

代码语言:javascript
复制
const initContainer = () => {
  const app = new PIXI.Application({ 
    width: 600, 
    height: 1000, 
    background: 'fff' 
  });
  container.value.appendChild(app.view);
  return app;
} 

2. 实现添加Sprite函数:

SpritePIXI中一个重要的概念,最后的气泡兔就是由一个个的Sprite拼出来的,最后再把每一个Sprite添加到stage中:

代码语言:javascript
复制
const setSprite = (app: any, x: any, y: any, size: any, scale: any) => {
  let sprite = PIXI.Sprite.from('circle.png');
  sprite.width = size;
  sprite.height = size;
  sprite.x = x * scale - size;
  sprite.y = y * scale - size;
  app.stage.addChild(sprite);
}

3. 核心三步绘制气泡兔

3.1 加载剪影图片,获取像素数据

剪影图片是一张由黑色主体和透明背景或纯色背景构成的一张图片,我们要加载这张剪影图片并获取到每个像素的数据。

下面是通过canvas来加载图片的过程,并通过getImageData()函数获取到了一个包含以 RGBA 为顺序的一维数组数据:

代码语言:javascript
复制
const transform = (app: any) => {
  const canvas = document.createElement("canvas") as HTMLCanvasElement;
  const ctx = canvas.getContext("2d") as CanvasRenderingContext2D;
  const image = new Image();
  image.src = "rabbit.jpeg";
  image.onload = () => {
    canvas.width = image.width;
    canvas.height = image.height;
    ctx.drawImage(image, 0, 0);

    // Uint8ClampedArray 类型
    const imageData = ctx.getImageData(0, 0, image.width, image.height).data;
    consoel.log(imageData) // 长度 = 高度 × 宽度 × 4 bytes
  }
}

3.2 搞清楚每个像素的颜色

需要通过双层循环来逐行对剪影图片中的每一个像素进行检查,在遍历时可以指定一个固定的step来控制遍历点的密度,在获取每一个position的时候要保持是一组RGBA4位的长度的倍数,这样在拿到每个点以后,通过下标来分别获取到R\G\B\A四个值:

代码语言:javascript
复制
const imageData = ctx.getImageData(0, 0, image.width, image.height).data;
const step = 20; // 控制每个点的密度

for (let y = 0; y < image.height; y += step) {
  for (let x = 0; x < image.width; x += step) {
    const position = (image.width * y + x) * 4;

    // 4个字节表示一组RGBA数据
    const r = imageData[position];
    const g = imageData[position + 1];
    const b = imageData[position + 2];
    const a = imageData[position + 3];

    if (r + g + b === 0 &amp;&amp; a !== 0) { // 纯黑
      // TODO 绘制气泡
    }
  }
}

3.3 着手绘制气泡兔

在获取到每一组的RGBA数据后,如果R、G、B均为 0 且透明度非 0,那么代表这个位置需要绘制气泡了,绘制的气泡大小随机产生:

代码语言:javascript
复制
const scale = 0.8; // 控制绘制的整体缩放比

if (r + g + b === 0 &amp;&amp; a !== 0) { // 纯黑
  const size = (Math.random() * 10 + 20) / 3;
  let sx = x * scale - size;
  let sy = y * scale - size;
  setSprite(app, sx, sy, size, scale);
}

气泡兔:

总结

本小节就到此结束了,文中提到的加载图片、获取像素点、遍历每个像素获取RGBA数据都搞清楚了吗?破解登录时遇到的滑动验证码是不是也可以用到这里面的知识点呢?大家可以发散一下思维。再次祝各位同学,兔年大吉、新春快乐~


如果看完觉得有收获,欢迎点赞、评论、分享支持一下。你的支持和肯定,是我坚持写作的动力~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-01-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🚀技术&代码分享
  • 😇推荐几个好用的工具
  • 进入正题
  • 1. 初始化容器
  • 2. 实现添加Sprite函数:
  • 3. 核心三步绘制气泡兔
    • 3.1 加载剪影图片,获取像素数据
      • 3.2 搞清楚每个像素的颜色
        • 3.3 着手绘制气泡兔
        • 总结
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档