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 jqgrid 对含特殊字符json 数据的 Java 处理方法
Jan 01 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
Apr 11 Javascript
jquery实现保存已选用户
Jul 21 Javascript
js实现遮罩层弹出框的方法
Jan 15 Javascript
不同编码的页面表单数据乱码问题解决方法
Feb 15 Javascript
JS实现alert中显示换行的方法
Dec 17 Javascript
微信小程序的动画效果详解
Jan 18 Javascript
原生JS实现圆环拖拽效果
Apr 07 Javascript
React数据传递之组件内部通信的方法
Dec 31 Javascript
学习JS中的DOM节点以及操作
Apr 30 Javascript
小程序实现新用户判断并跳转激活的方法
May 20 Javascript
优化Vue项目编译文件大小的方法步骤
May 27 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 htmlspecialchars加强版
2010/02/16 PHP
rephactor 优秀的PHP的重构工具
2011/06/09 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
2014/11/06 PHP
PHP获取文件行数的方法
2015/06/10 PHP
通过php动态传数据到highcharts
2017/04/05 PHP
thinkphp5.1框架容器与依赖注入实例分析
2019/07/23 PHP
javascript编程起步(第二课)
2007/02/27 Javascript
JavaScript confirm选择判断
2008/10/18 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
vue分页组件table-pagebar使用实例解析
2020/11/15 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
微信公众平台 发送模板消息(Java接口开发)
2019/04/17 Javascript
JavaScript实现像雪花一样的Hexaflake分形
2020/07/07 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
python实现调用其他python脚本的方法
2014/10/05 Python
使用Python构建Hopfield网络的教程
2015/04/14 Python
Python NumPy库安装使用笔记
2015/05/18 Python
详解python3中zipfile模块用法
2018/06/18 Python
numpy matrix和array的乘和加实例
2018/06/28 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
Python json转字典字符方法实例解析
2020/04/13 Python
利用Vscode进行Python开发环境配置的步骤
2020/06/22 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
python解压zip包中文乱码解决方法
2020/11/27 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
利用Canvas模仿百度贴吧客户端loading小球的方法示例
2017/08/13 HTML / CSS
英文求职信写作小建议
2014/02/16 职场文书
工作保证书
2015/01/17 职场文书
库房管理员岗位职责
2015/02/12 职场文书
2015年秋季开学典礼校长致辞
2015/07/16 职场文书
导游词之吉林花园山
2019/10/17 职场文书
python基础之错误和异常处理
2021/10/24 Python