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 相关文章推荐
整理8个很棒的 jQuery 倒计时插件和教程
Dec 12 Javascript
javascript创建和存储cookie示例
Jan 07 Javascript
JavaScript中string转换成number介绍
Dec 31 Javascript
基于jQuery创建鼠标悬停效果的方法
Mar 07 Javascript
js实现兼容IE和FF的上下层的移动
May 04 Javascript
javascript中活灵活现的Array对象详解
Nov 30 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
Feb 06 Javascript
Bootstrap免费字体和图标网站(值得收藏)
Mar 16 Javascript
解决Vue不能检测数组或对象变动的问题
Feb 24 Javascript
详解javascript中的babel到底是什么
Jun 21 Javascript
JS实现秒杀倒计时特效
Jan 02 Javascript
JS实现简易计算器
Feb 14 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中动态显示签名和ip原理
2007/03/28 PHP
PHP实现域名whois查询的代码(数据源万网、新网)
2010/02/22 PHP
php+js实现图片的上传、裁剪、预览、提交示例
2013/08/27 PHP
php实现删除空目录的方法
2015/03/16 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
PHP赋值的内部是如何跑的详解
2019/01/13 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
JavaScript中的Document文档对象
2008/01/16 Javascript
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
如何获取select下拉框的值(option没有及有value属性)
2013/11/08 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
JavaScript实现网页加载进度条代码超简单
2015/09/21 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
jQuery改变form表单的action,并进行提交的实现代码
2016/05/25 Javascript
使用Angular-CLI构建NPM包的方法
2018/09/07 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
python求众数问题实例
2014/09/26 Python
Python随手笔记第一篇(2)之初识列表和元组
2016/01/23 Python
python中的列表与元组的使用
2019/08/08 Python
Django 限制访问频率的思路详解
2019/12/24 Python
PythonPC客户端自动化实现原理(pywinauto)
2020/05/28 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
李维斯牛仔裤英国官方网站:Levi’s英国
2019/10/10 全球购物
美国滑板店:Tactics
2020/11/08 全球购物
金融专业个人求职信
2013/09/22 职场文书
开业庆典邀请函
2014/01/08 职场文书
中学生寄语大全
2014/04/03 职场文书
工会工作先进事迹
2014/08/18 职场文书
2014年技术员工作总结
2014/11/18 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
redis实现共同好友的思路详解
2021/05/26 Redis
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis