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 05 Javascript
jQuery中:checked选择器用法实例
Jan 04 Javascript
常用DOM整理
Jun 16 Javascript
JavaScript实现LI列表数据绑定的方法
Aug 04 Javascript
js实现div拖动动画运行轨迹效果代码分享
Aug 27 Javascript
浅谈String.valueOf()方法的使用
Jun 06 Javascript
全面理解JavaScript中的继承(必看)
Jun 16 Javascript
很酷的星级评分系统原生JS实现
Aug 25 Javascript
layui radio单选限制下一个radio单选的实例
Sep 03 Javascript
JS计算斐波拉切代码实例
Sep 12 Javascript
react MPA 多页配置详解
Oct 18 Javascript
微信小程序聊天功能的示例代码
Jan 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
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
php采用ajax数据提交post与post常见方法总结
2014/11/10 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
对google个性主页的拖拽效果的js的完整注释[转]
2007/04/10 Javascript
禁止js文件缓存的代码
2010/04/09 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
2012/12/09 Javascript
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
浅谈JS中逗号运算符的用法
2016/06/12 Javascript
详解用场景去理解函数柯里化(入门篇)
2019/04/11 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
vuejs移动端实现div拖拽移动
2019/07/25 Javascript
vue实现滑动超出指定距离回顶部功能
2019/07/31 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
使用EduBlock轻松学习Python编程
2018/10/08 Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
2019/04/30 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
Python django框架 web端视频加密的实例详解
2020/11/20 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
HTML5的download属性详细介绍和使用实例
2014/04/23 HTML / CSS
英国体育器材进口商店:UK Sport Imports
2017/03/14 全球购物
爱普生美国官网:Epson美国
2018/11/05 全球购物
Rowdy Gentleman服装和配饰:美好时光
2019/09/24 全球购物
DC Shoes荷兰官方网站:美国极限运动品牌
2019/10/22 全球购物
澳大利亚领先的在线礼品网站:Gifts Australia
2020/08/15 全球购物
C++:局部变量能否和全局变量重名
2014/03/03 面试题
动物科学专业毕业生的自我评价
2013/11/29 职场文书
大学生怎样进行自我评价
2013/12/07 职场文书
《寓言两则》教学反思
2014/02/27 职场文书
派出所所长先进事迹
2014/05/19 职场文书
工地标语大全
2014/06/18 职场文书
高中生旷课检讨书
2014/10/08 职场文书
工作能力自我评价2015
2015/03/05 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
小兵张嘎电影观后感
2015/06/03 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书