复制通道疑问(BitmapData类)

时间:2011-05-03 08:45:11

标签: flash actionscript-3

我正在开发一个类似于MS Paint的应用程序。我正在构建一个Flash Paint应用程序。基本结构是这样的。 我有两层,即topLayer_mc和bottomLayer_mc。实际矢量绘图绘制在工具的顶层和onmouseUp上,顶层上的矢量图形的位图副本被采用并作为位图添加到底层。随后清除顶层。它适用于铅笔工具。 现在我需要创建一个橡皮擦工具。这是事情变得棘手的地方。在应用程序中有一个选项将图像保存为png,因此alpha保留最高。所以使用矢量绘制画笔和使用位图绘制方法的传统方法是行不通的。当然,在视觉水平上,如果使用矢量绘制的画笔具有与背景相同的颜色,它将起作用。

我需要的是激动地擦除像素。

橡皮擦是矩形的。

我要使用的技术是使用BitmapData类的copyChannel方法。指定一个 通道(比如绿色通道)十六进制值为00并将其作为源。然后制作目标频道ALPHA。

我没有使用动画片段就可以使用它,如下所示。

stage.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDowny)

var bmd:BitmapData = new BitmapData(100, 80, true, 0xFFFF0000);
var bm:Bitmap = new Bitmap(bmd);
this.addChild(bm);

function onMouseDowny(evt:MouseEvent):void
{
    var rect:Rectangle = new Rectangle(0, 0, 20, 20);
    var pt:Point = new Point(mouseX, mouseY);
    bmd.copyChannel(bmd, rect, pt, BitmapDataChannel.GREEN , BitmapDataChannel.ALPHA);
}

只需点击红色sqaure中的多个点,这些点的alpha就为零。

在这里,鼠标点的alpha数据为零。它使用复制通道。 swf在这里显示。

swf的链接 -

http://bobbythecoder.blogspot.com/2011/05/copy-channel-doubt-woking.html

但是当我尝试在应用程序中使用它时,它只是不起作用。当然我需要的是一种通过鼠标移动来进行大量擦除的方法。但是首先我需要用所需的矩形尺寸清除我的特定点。

SWF在这里给出:

http://bobbythecoder.blogspot.com/2011/05/copy-channel-doubt-not-working.html

单击铅笔,然后在画布上使用铅笔绘制。

这里给出了fla。 http://www.easy-share.com/1915107181/Eraser复制频道.fla

我正在使用的代码就是这个。

var gfx:Graphics;

gfx=topLayer_mc.draw_mc.graphics;

var eraserBitmapData:BitmapData;

var bm:Bitmap;

pollPencil();

pollEraser();


function pollPencil():void {

pencil_btn.addEventListener(MouseEvent.MOUSE_DOWN,onPencilDraw);

}


function onPencilDraw(evt:MouseEvent):void {

topLayer_mc.addEventListener(MouseEvent.MOUSE_DOWN,onMouseActivity);

}


function onMouseActivity(evt:MouseEvent):void {

switch (String(evt.type)) {

case "mouseDown" :

var initX:Number=topLayer_mc.mouseX;

var initY:Number=topLayer_mc.mouseY;

gfx.lineStyle(1,0,1);

gfx.moveTo(initX,initY);

topLayer_mc.addEventListener(MouseEvent.MOUSE_MOVE, onMouseActivity);

break;

case "mouseUp" :

topLayer_mc.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseActivity);

var mcBMPD:BitmapData=new BitmapData(topLayer_mc.width,topLayer_mc.height,true,0x000000);

var mcBMP:Bitmap=new Bitmap(mcBMPD);

mcBMPD.draw(topLayer_mc.draw_mc);

bottomLayer_mc.addChild(mcBMP);

gfx.clear();



break;

case "mouseMove" :

var finalX:Number=topLayer_mc.mouseX;

var finalY:Number=topLayer_mc.mouseY;

gfx.lineTo(finalX,finalY);

topLayer_mc.addEventListener(MouseEvent.MOUSE_UP, onMouseActivity);



}

}

function pollEraser()

{

    eraserBitmapData = new BitmapData(bottomLayer_mc.width,bottomLayer_mc.height,true,0x00000000);

        eraserBitmapData.draw(bottomLayer_mc);

    var rect:Rectangle = new Rectangle(0, 0, 50, 50);

    var pt:Point = new Point(10,10);

    eraserBitmapData.copyChannel(eraserBitmapData, rect, pt, BitmapDataChannel.GREEN, BitmapDataChannel.ALPHA);

    bm =new Bitmap(eraserBitmapData);

    bottomLayer_mc.addChild(bm);

}

1 个答案:

答案 0 :(得分:0)

我真的不知道你在那里做什么,但我做了类似绘图板的擦除功能。在我的董事会中,擦除是这样实现的:

  1. 在橡皮擦模式下,在不可见的精灵(矢量画布)上绘制粗黑线。
  2. 在每个MOUSE_MOVE之后,使用BlendMode.ERASE将画布(仅笔划区域)绘制到主位图。这样做 - 橡皮擦工具绘制的线条会切割主位图中的像素。
  3. 清除画布'图形以便及时处理一个笔画。
  4. 由于您的橡皮擦是矩形的,您需要像使用刷子一样对待它 - 用鼠标移动扩展矩形。唯一不同的结果应该是不可见的,并在擦除模式下绘制。