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 相关文章推荐
Convert Seconds To Hours
Jun 16 Javascript
学习JavaScript的最佳方法分享
Oct 21 Javascript
jquery动态加载select下拉框示例代码
Dec 10 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
Feb 16 Javascript
JavaScript中省略元素对数组长度的影响
Oct 26 Javascript
详解在AngularJS的controller外部直接获取$scope
Jun 02 Javascript
JavaScript输出所选择起始与结束日期的方法
Jul 12 Javascript
解决vue中对象属性改变视图不更新的问题
Feb 23 Javascript
vue弹窗组件使用方法
Apr 28 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
May 04 Javascript
Puppeteer环境搭建的详细步骤
Sep 21 Javascript
vue下canvas裁剪图片实例讲解
Apr 16 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
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
PHP附件下载中文名称乱码的解决方法
2015/12/17 PHP
PHP计算日期相差天数实例分析
2016/02/23 PHP
用js实现的模拟jquery的animate自定义动画(2.5K)
2010/07/20 Javascript
计算世界完全对称日的js代码,粗糙版
2011/11/04 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
js中复制行和删除行的操作实例
2013/06/25 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
JavaScript使用百度ECharts插件绘制饼图操作示例
2019/11/26 Javascript
jquery插件懒加载的示例
2020/10/24 jQuery
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
在Python中使用成员运算符的示例
2015/05/13 Python
浅谈python中scipy.misc.logsumexp函数的运用场景
2016/06/23 Python
Python开发的实用计算器完整实例
2017/05/10 Python
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
django框架中间件原理与用法详解
2019/12/10 Python
python实现查找所有程序的安装信息
2020/02/18 Python
python实现AdaBoost算法的示例
2020/10/03 Python
python如何利用paramiko执行服务器命令
2020/11/07 Python
python 窃取摄像头照片的实现示例
2021/01/08 Python
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
《七颗钻石》教学反思
2014/02/28 职场文书
财务总监管理职责范文
2014/03/09 职场文书
2015年党风建设工作总结
2015/04/29 职场文书
食堂管理制度范本
2015/08/04 职场文书
旅行社计调工作总结
2015/08/12 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js
golang 生成对应的数据表struct定义操作
2021/04/28 Golang
MySQL新手入门进阶语句汇总
2022/09/23 MySQL