Algorithm 如何制作涂抹工具算法?

Algorithm 如何制作涂抹工具算法?,algorithm,graphics,bit-manipulation,drawing,pixel,Algorithm,Graphics,Bit Manipulation,Drawing,Pixel,我正在为涂抹工具创建一个算法,但它必须逐像素完成 涂抹工具的概念很简单 onMouseMove-使用笔刷模板将旧点的像素复制到新点 我在按位操作中遇到问题。算法没有正确地绘制像素。(我从头开始创建这个算法,所以可能会有一些愚蠢的错误) diameter=brush.size; _bitData=_canvas.bitmapData; _bitwidth=_bitData.rect.width//帆布宽度 _bitVector=_bitData.getVector()//uint的一维向量 _b

我正在为涂抹工具创建一个算法,但它必须逐像素完成

涂抹工具的概念很简单

onMouseMove-使用笔刷模板将旧点的像素复制到新点

我在按位操作中遇到问题。算法没有正确地绘制像素。(我从头开始创建这个算法,所以可能会有一些愚蠢的错误)

diameter=brush.size;
_bitData=_canvas.bitmapData;
_bitwidth=_bitData.rect.width//帆布宽度
_bitVector=_bitData.getVector()//uint的一维向量
_brushVector=brush.bitmapData.getVector()//uint的一维向量
brushVectorIndex=0;
对于(yIndex=0;yIndex
如果您可以建议如何优化此代码,那么这也会很有帮助,因为此代码每帧将运行10000次

编辑:制作了一个有效的解决方案。上面的按位操作是非常错误的。下面的代码没有经过优化,但可以正常工作

private function smudgeIt(画笔:uint,旧鼠标:uint,新鼠标:uint):uint
{
var像素:uint;
变量bA:uint=(画笔>>24)&0xff;
变量oA:uint=(旧鼠标>>24)&0xff;
var oldAlpha:uint=oA>16)和0xff;
黄金=(旧鼠标>>8)&0xff;
粗体=(旧鼠标和0xff);
rNew=(新鼠标>>16)&0xff;
gNew=(新鼠标>>8)&0xff;
bNew=(newMouse&0xff);
var newAlpha:uint=((新鼠标>>24)和0xff)-oldapha;
newAlpha=newAlpha>24)&0xff)+oldapha;
finalAlpha=finalAlpha>255?255:finalAlpha;

pixel=finalAlpha对alpha通道的含义有一些混淆。
使用旧的和笔刷的混合覆盖新位置的RGB通道时显示的代码:

RGB_new = RGB_old | RGB_brush;
alpha_new = alpha_new | (alpha_old & alpha_brush);
这不是您想要的,您在新位置丢失了所有颜色信息(因此没有将其混合),更糟糕的是,如果画笔确实具有RGB信息,您将使所有通道饱和,直到获得纯白色。
让我们暂时忘记alpha通道,让我们从纯不透明RGB表格开始。
如您所述,画笔作为位掩码运行:如果位设置为1,则从旧位置获取像素,否则从新位置保留像素。假设8位
mask8=mask1*16rf
),应用于1像素的1-8位通道:

R_new = (R_new & (256-mask8)) | (R_old & mask8);

现在假设一个24位掩码(8位掩码重复3次,
(mask8)我尝试做的基本概念是从旧鼠标点复制像素的颜色(RGB),但将其与画笔的alpha值相乘。因此,假设我有一个从左到右梯度[100%alpha到0%alpha]的圆形画笔。因此我的程序将复制红色像素(红色是旧鼠标点的颜色,如图所示)具有相同的渐变。笔刷永远不会有自己的颜色。它只是旧点的alpha贴图。然后将其打印到新点上。这就是通道将获得或(可能我不确定此按位操作)。结果=L到R[100%红色-洋红-100%蓝色]循环。还有一件事。程序将在复制像素时考虑旧点的alpha,因此如果旧点有50%像素的红色像素,而刷的对应像素具有100%α,则结果将是50%α-红色像素。在绘制新的点时,我们也可以将alpha混合应用到alpha通道,使用与我用于红色通道相同的配方。经过数月的努力,我不敢相信它。它完成了。它并不完美,例如,有时用蓝色涂抹黑色会产生绿色。但误差小于5%。这对我来说已经足够好了。我我正在用我的解决方案编辑这个问题。如果你能优化代码性能,那将非常有帮助。谢谢
RGB_new = (RGB_new & (~mask24)) | (R_old & mask24);
R_new = (R_new * (255-alpha) + R_old*alpha) / 255;