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 相关文章推荐
javascript parseInt与Number函数的区别
Jan 21 Javascript
Javascript技巧之不要用for in语句对数组进行遍历
Oct 20 Javascript
Jquery实现的角色左右选择特效
May 21 Javascript
jquery修改网页背景颜色通过css方法实现
Jun 06 Javascript
checkbox选中与未选中判断示例
Aug 04 Javascript
jQuery中empty()方法用法实例
Jan 16 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
Sep 01 Javascript
JS得到当前时间的方法示例
Mar 24 Javascript
JS点击缩略图整屏居中放大图片效果
Jul 04 Javascript
详解如何使用 vue-cli 开发多页应用
Dec 16 Javascript
微信开发之微信jssdk录音功能开发示例
Oct 22 Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
Apr 15 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的explode和implode的使用说明
2011/07/17 PHP
PHP循环语句笔记(foreach,list)
2011/11/29 PHP
PHP得到某段时间区间的时间戳 php定时任务
2012/04/12 PHP
php中的一些数组排序方法分享
2012/07/20 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
2016/05/06 PHP
解读PHP中上传文件的处理问题
2016/05/29 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
php使用高斯算法实现图片的模糊处理功能示例
2016/11/11 PHP
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
2007/12/23 Javascript
最常用的12种设计模式小结
2011/08/09 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
JavaScript中数据结构与算法(四):串(BF)
2015/06/19 Javascript
Jquery简单分页实现方法
2015/07/24 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
Nodejs抓取html页面内容(推荐)
2016/08/11 NodeJs
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
2017/01/13 Javascript
AngularJS 验证码60秒倒计时功能的实现
2017/06/05 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
2018/02/08 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
JS基于ES6新特性async await进行异步处理操作示例
2019/02/02 Javascript
在Vue.js中使用TypeScript的方法
2020/03/19 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
[02:20]DOTA2亚洲邀请赛 IG战队出场宣传片
2015/02/07 DOTA
[10:14]2018DOTA2国际邀请赛寻真——paiN Gaming不仅为自己而战
2018/08/14 DOTA
python 利用Pyinstaller打包Web项目
2020/10/23 Python
几个解决兼容IE6\7\8不支持html5标签的几个方法
2013/01/07 HTML / CSS
美国家喻户晓的保健品品牌:Vitamin World(维他命世界)
2016/08/19 全球购物
导师就业推荐信范文
2014/05/22 职场文书
跑操口号
2014/06/12 职场文书
大四毕业生自荐书
2014/07/05 职场文书
工人先进事迹材料
2014/12/26 职场文书