js 计算图片内点个数的示例代码


Posted in Javascript onApril 04, 2019

前言

图片是由连续的点信息组成,每个点信息包含四个长度即rgba信息,通过遍历配合处理函数实现对点个数的判断。

js 计算图片内点个数的示例代码

实现思路

本例子采用png格式图片,只需要判该点透明度(opacity)是否为0即可确定是否为小球上一点,如果不为0,判断上下左右方向的点是否透明度为0,不为0递归该结果,并且将该点的rgba信息置为0;结束后开始下一个主循环并计数,直至循环结束。

具体步骤

创建canvas对象,加载目标图片,使用canvas的drawImage方法将该图片对象写入canvas中;参数为图片对象,贴图起点横坐标,贴图起点纵坐标,贴图宽度,贴图高度。

var canvas = document.createElement('canvas'),
var ctx = canvas.getContext('2d');
ctx.drawImage(imgObj, 0, 0,imgWidth,imgHeight);

获取图片的相关信息canvas的getImageData方法,需要使用图片上各点的rgba信息;参数为采点起始横坐标,采点起始纵坐标,采点宽度,采点高度。

var imageData = ctx.getImageData(0,0,width,height);
//改写imageData.data信息实现点的计数

遍历图片的点信息imageData.data,四个点为一组增长条件为i+4,当透明度不为0时调用处理函数,并且终止循环(终止循环,防止短时间内循环次数过多造成内存溢出),循环条件为numberStart<imageData.data.length-1 结束,number为最终的点数量;numberStart为上次循环结束时点的索引值,number为点的数量,judgeZero为处理函数。

function repeateData(){
    for(var i=numberStart;i<imageData.data.length;i+=4){
      numberStart+=4;
      var a = imageData.data[i+3];
      if(a != 0) {
        judgeZero(i,number);
        break;
      }
    }
    if(numberStart<imageData.data.length-1){
      repeateData()
    }else{
      console.log(number);
    }
  }

点的处理函数,根据图片的宽和高计算出点的坐标(x,y),并且计算出该点上下左右四个点的透明度信息。

function judgeZero(index){
    number++;
    clearPoints(index);
  }
  function clearPoints(index){
    var x = (index/4)%width,
      y = Math.floor(index/4/width);

    var up = (x+(y-1)*width)*4,
      down = (x+(y+1)*width)*4,
      right = (x+1+y*width)*4,
      left = (x-1+y*width)*4;

    var uA = imageData.data[up+3],
      bA = imageData.data[down+3],
      rA = imageData.data[right+3],
      lA = imageData.data[left+3];
  }
  function clearRgb(index){
    imageData.data[index] = 0;
    imageData.data[index+1] = 0;
    imageData.data[index+2] = 0;
    imageData.data[index+3] = 0;
  }

判断四个方向的透明度是否为0,如果为0继续调用,并且擦出该点信息。

if(uA != 0){
    clearRgb(up);
    clearPoints(up);
  }
  if(bA != 0){
    clearRgb(down);
    clearPoints(down);
  }
  if(rA != 0){
    clearRgb(right);
    clearPoints(right);
  }
  if(lA != 0){
    clearRgb(left);
    clearPoints(left);
  }

将透明度不为0的所有点信息置为0,之后该点不会对主循环的判断有影响。

function clearRgb(index){
    imageData.data[index] = 0;
    imageData.data[index+1] = 0;
    imageData.data[index+2] = 0;
    imageData.data[index+3] = 0;
  }

执行4,5,6步骤直至所有点rgba信息都被置为0,主循环继续,最后可得到数量。

总结

主要的原理为获取球上的一点,通过上下左右递归来判断连续点并消除点信息,至该点的信息已在imageData.data中全部抹去,此过程记为1个点,主循环继续;图片为png格式,点的类型不限于圆形;该方法仅供参考。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
激活 ActiveX 控件
Oct 09 Javascript
javascript 去字符串空格终极版(支持utf8)
Nov 14 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
May 22 Javascript
javascript学习笔记(二) js一些基本概念
Jun 18 Javascript
js控制文本框输入的字符类型方法汇总
Jun 19 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
Aug 17 Javascript
jQuery Ajax实现跨域请求
Jan 21 Javascript
微信小程序实现无限滚动列表
May 29 Javascript
详解Jest结合Vue-test-utils使用的初步实践
Jun 27 Javascript
vue prop属性传值与传引用示例
Nov 13 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
Apr 10 Javascript
JS中间件设计模式的深入探讨与实例分析
Apr 11 Javascript
在node中使用jwt签发与验证token的方法
Apr 03 #Javascript
全面了解JavaScript的作用域链
Apr 03 #Javascript
从理论角度讨论JavaScript闭包
Apr 03 #Javascript
Node.js+Express+Mysql 实现增删改查
Apr 03 #Javascript
微信小程序配置服务器提示验证token失败的解决方法
Apr 03 #Javascript
js前端面试之同步与异步问题详解
Apr 03 #Javascript
详解JavaScript 为什么要有 Symbol 类型?
Apr 03 #Javascript
You might like
php中常用字符串处理代码片段整理
2011/11/07 PHP
php输出xml必须header的解决方法
2014/10/17 PHP
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
json 实例详细说明教程
2009/10/31 Javascript
jquery tab插件精简版分享
2011/09/10 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
网页防止tab键的使用快速解决方法
2013/11/07 Javascript
node.js中的fs.chmodSync方法使用说明
2014/12/18 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
Bootstrap进度条实现代码解析
2017/03/07 Javascript
js 获取今天以及过去日期
2017/04/11 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
200行代码实现blockchain 区块链实例详解
2018/03/14 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
浅谈python 四种数值类型(int,long,float,complex)
2016/06/08 Python
Django rest framework基本介绍与代码示例
2018/01/26 Python
python从zip中删除指定后缀文件(推荐)
2019/12/05 Python
pyqt5中动画的使用详解
2020/04/01 Python
可持续木材、生态和铝制太阳镜:Proof Eyewear
2019/07/24 全球购物
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
班组拓展活动方案
2014/08/14 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
对外汉语专业大学生职业生涯规划书
2014/10/11 职场文书
2014年卫生工作总结
2014/11/27 职场文书
网络营销实训总结
2015/08/03 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书
JavaScript模拟实现网易云轮播效果
2022/04/04 Javascript