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 相关文章推荐
判断滚动条到底部的JS代码
Nov 04 Javascript
深入理解JavaScript系列(36):设计模式之中介者模式详解
Mar 04 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
Sep 09 Javascript
javascript实现的登陆遮罩效果汇总
Nov 09 Javascript
浅析Bootstrip的select控件绑定数据的问题
May 10 Javascript
Javascript 5种方法实现过滤删除前后所有空格
Jun 22 Javascript
Angular使用$http.jsonp发送跨站请求的方法
Mar 16 Javascript
Vue实现动态响应数据变化
Apr 28 Javascript
jquery点赞功能实现代码 点个赞吧!
May 29 jQuery
JS实现简单抖动效果
Jun 01 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
Sep 19 Javascript
Vue 仿QQ左滑删除组件功能
Mar 12 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
德生9700DX电路分析
2021/03/02 无线电
PHP 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
PHP 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
Javascript中eval函数的使用方法与示例
2007/04/09 Javascript
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
2010/03/04 Javascript
javascript定义变量时有var和没有var的区别探讨
2014/07/21 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
基于JS代码实现简单易用的倒计时 x 天 x 时 x 分 x 秒效果
2017/07/13 Javascript
jquery插件canvaspercent.js实现百分比圆饼效果
2017/07/18 jQuery
angular2+node.js express打包部署的实战
2017/07/27 Javascript
微信小程序实现上传多个文件 超过10个
2020/03/30 Javascript
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
Django的session中对于用户验证的支持
2015/07/23 Python
使用python实现生成用户信息
2017/03/20 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
2017/07/10 Python
Python GUI布局尺寸适配方法
2018/10/11 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
Python的缺点和劣势分析
2019/11/19 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
Python中实现输入一个整数的案例
2020/05/03 Python
Python字符串查找基本操作代码案例
2020/10/27 Python
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
中科软测试工程师面试题
2012/06/16 面试题
销售人员个人求职信
2013/09/26 职场文书
爽歪歪广告词
2014/03/20 职场文书
中学生期中自我鉴定
2014/04/20 职场文书
中国梦我的梦演讲稿
2014/04/23 职场文书
六查六看剖析材料
2014/10/06 职场文书
2015幼儿园庆元旦活动方案
2014/12/09 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书