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 文本框回车跳到下一个文本框示例代码
Aug 30 Javascript
JS跨域问题详解
Nov 25 Javascript
全面解析node 表单的图片上传
Nov 21 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
Nov 24 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
Dec 07 Javascript
详解angular ui-grid之过滤器设置
Jun 07 Javascript
Vue.js实现输入框绑定的实例代码
Aug 24 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
Sep 20 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
Aug 08 jQuery
layui结合form,table的全选、反选v1.0示例讲解
Aug 15 Javascript
Node.js创建一个Express服务的方法详解
Jan 06 Javascript
javascript实现评分功能
Jun 24 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提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
用PHP实现小写金额转换大写金额的代码(精确到分)
2012/01/10 PHP
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
DOM基础教程之使用DOM设置文本框
2015/01/20 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
2015/03/25 Javascript
javascript通过元素id和name直接取得元素的方法
2015/04/28 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
javascript比较两个日期相差天数的方法
2015/07/24 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
2016/03/28 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
2016/07/24 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
2016/12/28 Javascript
微信小程序 基础知识css样式media标签
2017/02/15 Javascript
React.js中常用的ES6写法总结(推荐)
2017/05/09 Javascript
对Vue table 动态表格td可编辑的方法详解
2018/08/28 Javascript
Vue-cli3简单使用(图文步骤)
2019/04/30 Javascript
vue数据响应式原理知识点总结
2020/02/16 Javascript
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
使用Python生成随机密码的示例分享
2016/02/18 Python
深入理解Python对Json的解析
2017/02/14 Python
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
2019/09/11 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
Bootstrap File Input文件上传组件
2020/12/01 HTML / CSS
Born鞋子官网:Born Shoes
2017/04/06 全球购物
shell的种类有哪些
2015/04/15 面试题
求职自荐信范文格式
2013/11/29 职场文书
社会发展项目建议书
2014/08/25 职场文书
论文评审意见
2015/06/05 职场文书
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python
千万级用户系统SQL调优实战分享
2022/03/03 MySQL
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL
MySQL事务操作的四大特性以及并发事务问题
2022/04/12 MySQL