我正在创建一种涂抹工具的算法,但是必须逐个像素地完成。
涂抹工具的概念很简单
onmouseMove-使用画笔模板将旧点的像素复制到新点
我在按位运算中遇到问题。该算法无法正确绘制像素。(我是从头开始创建此算法的,因此可能会出现一些愚蠢的错误)
diameter = brush.size;
_bitData = _canvas.bitmapData;
_bitwidth = _bitData.rect.width;//width of canvas
_bitVector = _bitData.getVector();//1d vector of uint
_brushVector = brush.bitmapData.getVector();//1d vector of uint
brushVectorIndex = 0;
for(yIndex = 0; yIndex < diameter; yIndex++)
{
for(xIndex = 0; xIndex < diameter; xIndex++)
{
yCor = yIndex + oldY;
xCor = xIndex + oldX;
if(_bitData.rect.contains(xCor,yCor))
{
bitVectorIndex_old = (yCor * _bitWidth) + xCor;
bitVectorIndex_new = ((Y+yIndex) * _bitWidth) + X+xIndex;
//Creating alpha map of brush and old mouse point's pixel
brushPixelAlpha = (_brushVector[brushVectorIndex] & _bitVector[bitVectorIndex_old] & 0xFF000000);
//Adding colors to the aplha map according to old mouse point's pixel
brushPixel = brushPixelAlpha | (_bitVector[bitVectorIndex_old] & 0x00FFFFFF);
//Create alpha map for new pixel
pixelAlpha = ((brushPixel | _bitVector[bitVectorIndex_new]) & 0xFF000000)
//Adding color to pixel alpha map using brush's stamp
pixel = pixelAlpha | (brushPixel & 0x00FFFFFF);
_bitVector[bitVectorIndex_new] = pixel;
}
brushVectorIndex++;
}
}
_bitData.setVector(_bitVector);
如果您可以提出如何优化此代码的建议,那么这也将有所帮助,因为该代码每帧将运行10000s。
编辑:提出了一个可行的解决方案。上面的按位运算是非常错误的。以下代码未经过优化,但可以运行。
private function smudgeIt(brush:uint,oldmouse:uint,newMouse:uint):uint
{
var pixel:uint;
var bA:uint = (brush>>24)&0xff;
var oA:uint = (oldmouse>>24)&0xff;
var oldAlpha:uint = oA<bA?oA:bA;
var rOld:uint,gOld:uint,bOld:uint;
var rNew:uint,gNew:uint,bNew:uint;
rOld = (oldmouse >>16) & 0xff;
gOld = (oldmouse >>8) & 0xff;
bOld = (oldmouse & 0xff);
rNew = (newMouse >>16) & 0xff;
gNew = (newMouse >>8) & 0xff;
bNew = (newMouse & 0xff);
var newAlpha:uint = ((newMouse>>24)&0xff)-oldAlpha;
newAlpha = newAlpha<0?0:newAlpha;
rNew = (rNew*newAlpha + rOld*oldAlpha)/255;
gNew = (gNew*newAlpha + gOld*oldAlpha)/255;
bNew = (bNew*newAlpha + bOld*oldAlpha)/255;
var finalAlpha:uint = ((newMouse >> 24) & 0xff)+oldAlpha;
finalAlpha = finalAlpha>255?255:finalAlpha;
pixel = finalAlpha<<24 | rNew << 16 | gNew << 8 | bNew;
return pixel;
}