
思路:
保存成位图格式,像素,然后素描整张图,从左到右,下到上,判断颜色是否变化,变化了就记录坐标
代码:
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……………………
通过将图像保存为位图并进行像素级扫描,自左向右,从下至上,判断颜色变化来寻找交界点。采用折半查找法优化纵向遍历,将原来的5万多次循环减少到2千多次,显著提升了效率。最终找到了一系列的交界坐标。

1万+

被折叠的 条评论
为什么被折叠?



