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 UI Dialog控件中的表单无法正常提交的解决方法
Dec 19 Javascript
javascript基础知识大集锦(一) 推荐收藏
Jan 13 Javascript
jquery插件如何使用 jQuery操作Cookie插件使用介绍
Dec 15 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
Dec 13 Javascript
7个有用的jQuery代码片段分享
May 19 Javascript
理解Javascript的call、apply
Dec 16 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
Jan 23 Javascript
微信小程序 检查接口状态实例详解
Jun 23 Javascript
vue引入js数字小键盘的实现代码
May 14 Javascript
微信小程序适配iphoneX的实现方法
Sep 18 Javascript
vue单页应用在页面刷新时保留状态数据的方法
Sep 21 Javascript
vue实现把接口单独存放在一个文件方式
Aug 13 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
使用 MySQL 开始 PHP 会话
2006/12/21 PHP
thinkphp特殊标签用法概述
2014/11/24 PHP
PHP抽象类与接口的区别实例详解
2019/05/09 PHP
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
JavaScript prototype对象的属性说明
2010/03/13 Javascript
不要使用jQuery触发原生事件的方法
2014/03/03 Javascript
jquery实现用户信息修改验证输入方法汇总
2015/07/18 Javascript
javascript弹性运动效果简单实现方法
2016/01/08 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
JS获取中文拼音首字母并通过拼音首字母快速查找页面内对应中文内容的方法【附demo源码】
2016/08/19 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
JavaScript中的 attribute 和 jQuery中的 attr 方法浅析
2017/01/04 Javascript
微信小程序 input输入框详解及简单实例
2017/01/10 Javascript
BootStrap导航栏问题记录
2017/07/31 Javascript
Node 自动化部署的方法
2017/10/17 Javascript
详解React Native 屏幕适配(炒鸡简单的方法)
2018/06/11 Javascript
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
详解Vue中watch的详细用法
2018/11/28 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
vue-cli3跨域配置的简单方法
2019/09/06 Javascript
微信小程序实现侧边栏分类
2019/10/21 Javascript
Python实现判断并移除列表指定位置元素的方法
2018/04/13 Python
基于python生成器封装的协程类
2019/03/20 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
Python-opencv 双线性插值实例
2020/01/17 Python
Python 使用office365邮箱的示例
2020/10/29 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
一套Delphi的笔试题二
2013/05/11 面试题
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
2014厂务公开实施方案
2014/02/17 职场文书
函授生自我鉴定
2014/03/25 职场文书
争先创优演讲稿
2014/09/15 职场文书
私用公车造成事故检讨书
2014/11/16 职场文书
2015年工商所工作总结
2015/05/21 职场文书
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python