如何设置copyPixels以忽略透明像素?

时间:2011-03-17 21:47:28

标签: flash actionscript

我有一个透明的BitmapData对象(sourceBitmapData参数)。每次我使用copyPixels()将其复制到另一个BitmapData对象时,透明像素会替换它们下面的任何内容。我想copyPixels()函数简单地忽略这些完全透明的像素(0x00)而不是复制它们。

有什么想法吗?

顺便说一句,我已经尝试将alphaMerge设置为true,但这并没有解决问题 - 整个源对象只是变黑并忽略了所有透明度。

编辑:

以下是代码段;

var b:UIComponent = new UIComponent();
    b.graphics.beginFill(color, opacity);
    b.graphics.drawCircle(size * 2, size * 2, size);
    b.graphics.endFill();

    shape = new BitmapData(size * 4, size * 4, true, 0x00FFFFFF);
    shape.draw(b);
    rect = new Rectangle(0, 0, size * 4, size * 4);
    shape.applyFilter(shape, rect, new Point(0, 0), new BlurFilter(20, 20) );

它创建一个图形对象(在这种情况下为圆形)并将其复制到源位图,然后应用模糊滤镜。

drawBuffer.copyPixels(shape, rect, pnt, null, null, false);

之后,它会在drawBuffer上多次应用生成的图像。如果alphaMerge设置为true,则形状看起来像黑色blob - 似乎所有alpha信息都被忽略,alpha值设置为0xFF(注意:这是我根据它看起来的推测,我没有验证它)。另一方面,如果alphaMerge设置为false,则透明度就在那里,除了它将其下面的任何内容(drawBuffer中的像素)覆盖为透明像素。

以防万一你需要drawBuffer的代码:

drawBuffer = new BitmapData(bitmapData.width, bitmapData.height, true, 0);
drawCanvas.graphics.beginBitmapFill(drawBuffer, null, false, true);
drawCanvas.graphics.drawRect(0, 0, drawBuffer.width, drawBuffer.height);
drawCanvas.graphics.endFill(); 

4 个答案:

答案 0 :(得分:1)

你肯定希望mergeAlpha为真:

drawBuffer.copyPixels(shape, rect, pnt, null, null, true);

由于这对您不起作用,请仔细检查位图的内容。你可以直接将它添加到舞台上,保证你看到真实的内容:

var b:Bitmap = new Bitmap(shape);
stage.addChild(b);

如果此位图显示正确,可能是您在不清除目标的情况下多次复制位图。

同时将UIComponent更改为Sprite或类似内容。我不熟悉UIComponent,但您似乎没有使用它的任何功能。

答案 1 :(得分:1)

我尝试将您的代码复制到一个空白项目中。对我来说,它有一些样本值可以正常工作。还有别的错误。

将其复制到空白FLA中:

var color:uint = 0xff0000;
var opacity:Number = 0.8;
var size:Number = 50;

var b:Sprite = new Sprite();
b.graphics.beginFill(color, opacity);
b.graphics.drawCircle(size * 2, size * 2, size);
b.graphics.endFill();

// draw semitransparent object from "b" to shape
var shape:BitmapData = new BitmapData(size * 4, size * 4, true, 0x00FFFFFF);
shape.draw(b);
var rect:Rectangle = new Rectangle(0, 0, size * 4, size * 4);
shape.applyFilter(shape, rect, new Point(0, 0), new BlurFilter(20, 20) );
var pnt:Point = new Point;


// create drawBuffer with yellow (to indicate transparency)
var drawBuffer:BitmapData;
drawBuffer = new BitmapData(300, 300, true, 0xffffff00);

// copy to drawBuffer (preserving transparency)
drawBuffer.copyPixels(shape, rect, pnt, null, null, true);

// using drawCanvas, put drawBuffer to screen
var drawCanvas:Sprite = new Sprite;
drawCanvas.graphics.beginBitmapFill(drawBuffer, null, false, true);
drawCanvas.graphics.drawRect(0, 0, drawBuffer.width, drawBuffer.height);
drawCanvas.graphics.endFill(); 
addChild(drawCanvas);

(注意我已将true传入copyPixels的mergeAlpha。)

答案 2 :(得分:0)

我可能会遗漏一些显而易见的东西,但是copyPixel正是它所说的 - 复制像素。它完全忽略了下面的内容,因此任何非100%透明像素(合并设置为true)都会被像素覆盖。考虑到你有一个像素,0xFFFF00FF(一个红色)如果你复制到它的位置像素0x4400FF00结果将被覆盖,而不是绘图 - 0x4400FF00。

答案 3 :(得分:0)

在您的一次尝试中,您有以下一行:

drawBuffer = new BitmapData(300,300,true,0xffffff00);

尝试更改颜色输入的Alpha值,如下所示:

drawBuffer = new BitmapData(300,300,true,0x00ffff00);

- 这是一个小小的改变,但它可能会让你到达你想去的地方。

-xprdq