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 相关文章推荐
JQuery 学习笔记 选择器之五
Jul 23 Javascript
Jquery给基本控件的取值、赋值示例
May 23 Javascript
js中split和replace的用法实例
Feb 28 Javascript
jQuery插件bxSlider实现响应式焦点图
Apr 12 Javascript
js带缩略图的图片轮播效果代码分享
Sep 14 Javascript
jQuery异步提交表单的两种方式
Sep 13 Javascript
详解JS: reduce方法实现 webpack多文件入口
Feb 14 Javascript
Google 爬虫如何抓取 JavaScript 的内容
Apr 07 Javascript
Vue computed计算属性的使用方法
Jul 14 Javascript
node.js学习之断言assert的使用示例
Sep 28 Javascript
微信小程序自定义弹窗实现详解(可通用)
Jul 04 Javascript
jquery将json转为数据字典的实例代码
Oct 11 jQuery
在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
BBS(php &amp; mysql)完整版(三)
2006/10/09 PHP
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
2008/11/14 PHP
php用正则表达式匹配中文实例详解
2013/11/06 PHP
PHP引用(&amp;)各种使用方法实例详解
2014/03/20 PHP
php实现数据库的增删改查
2017/02/26 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
2017/08/18 PHP
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
JavaScript实现的日期控件具体代码
2013/11/18 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
2016/10/19 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
Ajax和Comet技术总结
2017/02/19 Javascript
浅谈webpack对样式的处理
2018/01/05 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
jQuery轮播图实例详解
2018/08/15 jQuery
nodejs和react实现即时通讯简易聊天室功能
2019/08/21 NodeJs
js实现多图和单图上传显示
2019/12/18 Javascript
js键盘事件实现人物的行走
2020/01/17 Javascript
python中的字符串内部换行方法
2018/07/19 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
Python操作json的方法实例分析
2018/12/06 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
python 安装移动复制第三方库操作
2020/07/13 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
2020/11/25 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
东方红海科技面试题软件测试方面
2012/02/08 面试题
请假条怎么写
2014/04/10 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
2014副局长群众路线对照检查材料思想汇报
2014/09/22 职场文书
2015年酒店工作总结
2015/04/28 职场文书
养成教育主题班会
2015/08/13 职场文书
2016大学迎新欢迎词
2015/09/29 职场文书