获取两色块交界处坐标

通过将图像保存为位图并进行像素级扫描,自左向右,从下至上,判断颜色变化来寻找交界点。采用折半查找法优化纵向遍历,将原来的5万多次循环减少到2千多次,显著提升了效率。最终找到了一系列的交界坐标。
题目:此乃位图,请获取棕白交界处的点坐标并存入一维数组中。

 

思路:

保存成位图格式,像素,然后素描整张图,从左到右,下到上,判断颜色是否变化,变化了就记录坐标

 

代码:

 

import flash.net.URLRequest;
import flash.display.Loader;
import flash.events.Event;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Point;

var url:URLRequest = new URLRequest("source.png");
var loader:Loader = new Loader();
var stepX:Number = 1;
var stepY:Number = 1;
var arr:Array = new Array();
var totle=0;

loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
loader.load(url);

function onComplete(e:Event):void{
	var l:LoaderInfo = e.target as LoaderInfo;
	var bitmap:Bitmap = l.content as Bitmap;
	doBitmapData(bitmap.bitmapData);
	
}

function doBitmapData(sourceImg:BitmapData){
	var imgWidth = sourceImg.width;
	var imgHeight = sourceImg.height;
	var i:Number =0;
	var j:Number;
	while(i<=imgWidth){
		j =0;
		while(j<imgHeight){
			totle+=1;
			if(sourceImg.getPixel(i,j)!=sourceImg.getPixel(i,j+stepY)){
				arr.push(new Point(i,j+stepY));
				break;
			}
			else{
				j+=stepY;
			}
		}
		i+=stepX;
		
	}
	
	trace("ok");
	
	trace(arr);
}


改进:

改进一下doBitmapData(sourceImg:BitmapData),在纵方向的遍历上使用折半查找的方法,经过计算,原来盲目遍历的循环的次数是5万多次,现在只用 2千多次,有了很大的提升。

 

function doBitmapData(sourceImg:BitmapData){
var imgWidth = sourceImg.width;
var imgHeight = sourceImg.height;
var i:Number =0;//横坐标
var j:Number;//纵坐标
//遍历源图每个步长的像素点
while(i<=imgWidth){

var low =0;
var high = imgHeight;
//折半查找
while(low<high){
var mid = Math.round((low + high) >> 1 ); 
if(sourceImg.getPixel(i,mid) == sourceImg.getPixel(i,low)){
if(sourceImg.getPixel(i,mid)!=sourceImg.getPixel(i,mid+stepY)){
arr.push(new Point(i,mid+stepY));
break;
}
low = mid + stepY;
}
else{
if(sourceImg.getPixel(i,mid)!=sourceImg.getPixel(i,mid-stepY)){
arr.push(new Point(i,mid));
break;
}
high = mid - stepY;
}
}
i+=stepX; 
} 

}


 

结果:

(x=0, y=169),(x=1, y=167),(x=2, y=166),(x=3, y=165),(x=4, y=164),(x=5, y=163),(x=6, y=162),(x=7, y=162),(x=8, y=161),(x=9, y=160),(x=10, y=158),(x=11, y=157),(x=12, y=156),(x=13, y=155),(x=14, y=154),(x=15, y=153),(x=16, y=152),(x=17, y=151),(x=18, y=151),(x=19, y=150),(x=20, y=149),(x=21, y=148),(x=22, y=147),(x=23, y=146),(x=24, y=146),(x=25, y=145),(x=26, y=144),(x=27, y=144),(x=28, y=143),(x=29, y=143),(x=30, y=142),(x=31, y=141),(x=32, y=141),(x=33, y=141),(x=34, y=140),(x=35, y=139),(x=36, y=139),(x=37, y=139),(x=38, y=138),(x=39, y=137),(x=40, y=137……………………

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值