我正在制作一个小应用程序,孩子们可以用颜色填充预设插图。我已经使用洪水填充算法成功实现了 MS-paint 风格的油漆桶。然而,靠近图像元素边缘的像素未填充,因为线条是抗锯齿的。这是因为当前是否填充的条件是colourAtCurrentPixel == colourToReplace
,这不适用于线条处的混合像素。
(颜色为 RGB 单位)
我想像 Photoshop 和其他复杂工具一样添加平滑/阈值选项,但是确定两种颜色之间的相等/距离的算法是什么?
if (match(pixel(x,y), colourToReplace) setpixel(x,y,colourToReplaceWith)
如何填写match
()?
这里是一张图片(左边是情况,右边是想要的)
替代文本 http://www.freeimagehosting.net/uploads/6aa7b4ad53.png
这是我当前的完整代码:
var b:BitmapData = settings.background;
b.lock();
var from:uint = b.getPixel(x,y);
var q:Array = [];
var xx:int;
var yy:int;
var w:int = b.width;
var h:int = b.height;
q.push(y*w + x);
while (q.length != 0) {
var xy:int = q.shift();
xx = xy % w;
yy = (xy - xx) / w;
if (b.getPixel(xx,yy) == from) { //<- want to replace this line
b.setPixel(xx,yy,to);
if (xx != 0) q.push(xy-1);
if (xx != w-1) q.push(xy+1);
if (yy != 0) q.push(xy-w);
if (yy != h-1) q.push(xy+w);
}
}
b.unlock(null);
好吧,我想最自然的方法是计算颜色之间的差异。为了获得合理的值,应该计算每个通道的差异。还没有测试过,但以下应该有效:
const perChanThreshold:uint = 5;
const overallThreshold:uint = perChanThreshold * perChanThreshold * 3;
function match(source:uint, target:uint):Boolean {
var diff:uint = 0, chanDiff:uint;
for (var i:int = 0; i < 3; i++) {
chanDiff = (source >> (i * 8)) & 0xFF;
diff += chanDiff * chanDiff;
}
return diff <= overallThreshold;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)