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 Dialog 弹出层对话框插件
Aug 09 Javascript
新浪微博字数统计 textarea字数统计实现代码
Aug 28 Javascript
javascript获取URL参数与参数值的示例代码
Dec 20 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
May 06 Javascript
全面解析Bootstrap手风琴效果
Apr 17 Javascript
利用CSS3在Angular中实现动画
Jan 15 Javascript
js链表操作(实例讲解)
Aug 29 Javascript
echarts学习笔记之箱线图的分析与绘制详解
Nov 22 Javascript
vue-cli项目修改文件热重载失效的解决方法
Sep 19 Javascript
使用NestJS开发Node.js应用的方法
Dec 03 Javascript
解决Angularjs异步操作后台请求用$q.all排列先后顺序问题
Nov 29 Javascript
JavaScript实现简单动态表格
Dec 02 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中Y2K38的漏洞解决方法实例分析
2014/09/22 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
PHP的mysqli_ssl_set()函数讲解
2019/01/23 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
Javascript 篱式条件判断
2008/08/22 Javascript
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
基于JQuery 滑动与动画的说明介绍
2013/04/18 Javascript
innerText 使用示例
2014/01/23 Javascript
jquery动态改变form属性提交表单
2014/06/03 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
果断收藏9个Javascript代码高亮脚本
2016/01/06 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
Webpack 服务器端代码打包的示例代码
2017/09/19 Javascript
从零开始搭建vue移动端项目到上线的步骤
2018/10/15 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
JavaScript enum枚举类型定义及使用方法
2020/05/15 Javascript
python实现多线程的两种方式
2016/05/22 Python
Python找出最小的K个数实例代码
2018/01/04 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
python识别验证码的思路及解决方案
2020/09/13 Python
Python通过len函数返回对象长度
2020/10/22 Python
python中time tzset()函数实例用法
2021/02/18 Python
Otticanet英国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/02/10 全球购物
C++程序员求职信
2014/05/07 职场文书
建筑节能汇报材料
2014/08/22 职场文书
高中生旷课检讨书
2014/10/08 职场文书
关于观后感的作文
2015/06/18 职场文书
生日宴会家属答谢词
2015/09/29 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书
2020年基层司法所建设情况调研报告
2019/11/30 职场文书
Canvas三种动态画圆实现方法说明(小结)
2021/04/16 Javascript
golang slice元素去重操作
2021/04/30 Golang
python实现简易自习室座位预约系统
2021/06/30 Python