我正在尝试从给定的位图中提取轮廓路径,我在as3上创建了一个快速算法(对我而言),即:
//@v source bitmap's vector data
//@x x to starting extraction
//@y y to stating extraction
//@w extraction width
//@h extraction height
//@mw source bitmap width
//@mh source bitmap height
private function extractRects(v:Vector.<uint>, x:int, y:int,
w:int, h:int, mw:int, mh:int):Array
{
var ary:Array = [], yy:int=y, vStart:int, _xx:int, xx:int;
var lcold:int = 0, lc:int;
//first line to last line
while(yy < h)
{
//first index of current vector
vStart = yy * mw + x;
xx = x;
lc = 0;
//first vector to last on current scan
while(xx < w)
{
/*
if current vector value (color) is
empty (transparent) then
check next
*/
while(xx < w && !v[vStart])
{
vStart++;
xx++;
}
//it is not empty so copy first index
_xx = xx;
//check till value is not empty
while(xx < w && v[vStart])
{
xx++;
vStart++;
}
//create rectangle
var rr:Rectangle = new Rectangle(_xx, yy, (xx-_xx), 1);
//if previous line has the same rectangle index
if(lc < lcold)
{
var oldrr:Rectangle = ary[ary.length - lcold];
//if previous neighbour rect on top
//has same horizontal position then
//resize its height
if(oldrr.left == rr.left && oldrr.width == rr.width)
oldrr.height++;
else
ary.push(rr);
}
else
ary.push(rr);
lc++;
xx++;
}
lcold = lc;
yy++;
}
return ary;
}
通过上面的方法,我通过绘制rects来提取区域并创建形状。 由于视图不流畅,绘图对我来说不是一个好的解决方案。
为了让视线更加平滑,我应该使用直线或曲线但是,相邻点的计算对我来说是一个非常头疼的问题。 你可以向我推荐一些众所周知的或更好的解决方案吗?as3,c ++,c#,vb.net,vb6,delphi,java或类似的语言将很好的答案。
感谢您的进步..
编辑清除
我正在尝试从位图中提取非透明像素的x,y坐标,以绘制不同的路径数据。 (32位ARGB)(创建形状)
到绘图我可以使用lineTo,curveTo,moveTo operations
moveTo(x, y)
lineTo(x, y)
curveTo(cx, cy, ax, ay)
在我的代码中,我认为我可以提取当前非透明块的矩形,并且我可以在其他图形方法上使用与moveTo和lineTo操作相同的rects
问题是使用这种方法在边缘上给出不平滑的外观,这是更直的水平或垂直
因此,解决方案是在边上创建点图,检测点邻域,使用lineTo操作(因为它生成抗锯齿线)在行上的相邻点之间,或计算最近圆区域上的点放置并使用curveTo方法..
我的问题是你能推荐一些提取工作的算法或方法。
抱歉我的英文
谢谢
答案 0 :(得分:0)
您正在寻找的是位图/光栅图像到矢量软件。为了获得高质量的结果,必须执行许多非平凡的步骤。有一个名为Potrace的开源项目可以做到这一点 - click here for a technical description of how it works。如果您想在GUI程序中尝试其算法,可以使用Inkscape及其Trace Bitmap函数。