AS3:BitmapData链接到库中的某个sprite?

时间:2014-01-15 11:14:10

标签: actionscript-3 actionscript background sprite bitmapdata

我有问题。我有一个精灵添加到库,我链接并命名其类“CarriedHead_Normal”。现在我想显示这个精灵并使每个黑色(000000)像素不可见(只是将背景转换为alpha)。

我知道我可以使用这个

 var bmpd:BitmapData = new BitmapData(width, height, true, 0x000000)

但是我应该如何将它与我的函数合并,所以我从库中调用该类并使其变为透明的?

我目前的代码:

 var imageSprite = new Sprite();
 addChild(imageSprite);



 var libraryImage:Bitmap = new Bitmap(new CarriedHead_Normal(0, 0))

 imageSprite.addChild(libraryImage);

提前致谢。

2 个答案:

答案 0 :(得分:0)

尝试类似:

var libraryImage:Bitmap = spriteToBitmap(new CarriedHead_Normal());
imageSprite.addChild(libraryImage);

function spriteToBitmap(sprite:Sprite, smoothing:Boolean = false):Bitmap
{
   var bitmapData:BitmapData = new BitmapData(sprite.width, sprite.height, true, 0x00000000);
   bitmapData.draw(sprite);
   bitmapData.threshold(bitmapData, bitmapData.rect, new Point(), '==', 0xff000000, 0x00000000);
   return new Bitmap(bitmapData, "auto", smoothing);
}

答案 1 :(得分:0)

你可以通过多种方式做到这一点,有些方法比其他方式更好:

在旁边节点上,您的问题标题与您的实际问题无关

1)使用混合模式

根据您的图形和背景,您可以使用简单的blendMode - 特别是BlendMode.SCREEN。请注意,某些混合模式要求您的父容器具有blendMode BlendMode.LAYER

2) copyPixels()使用alpha BMD

copyPixels()可让您指定要在复制哪些像素时使用的字母BitmapData(实际上是要复制的像素的Alpha值)。如果您有与您的黑色区域匹配的字母BitmapData,则可以将其删除:

var b:BitmapData = new BitmapData( myImageBMD.width, myImageBMD.height, true, 0x00000000 );
b.copyPixels( myImageBMD, myImageBMD.rect, new Point, alphaBMD, new Point, false ); // copy our image, using alphaBMD to remove the black

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#copyPixels()

3) floodFill()黑色区域

如果您的黑色区域是连续的并且您知道它开始的像素(例如,它是图像周围的黑框),那么您可以使用floodFill()删除黑色区域

var b:BitmapData = new BitmapData( myImageBMD.width, myImageBMD.height, true, 0x00000000 );
b.copyPixels( myImageBMD, myImageBMD.rect, new Point ); // copy our image so we keep the original
b.floodFill( 0, 0, 0x00000000 ); // assuming the first pixel is black, floodFill() from here, replacing with transparence

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#floodFill()

这种技术最适用于像素艺术,其边缘定义明确。

4) threshold()删除黑色

threshold()获取像素值,并将其替换为您设置的值,如果它们通过了某个测试(<<===等)。你可以用它来代替黑色透明。

var b:BitmapData = new BitmapData( myImageBMD.width, myImageBMD.height, true, 0x00000000 );
b.copyPixels( myImageBMD, myImageBMD.rect, new Point ); // copy our image so we keep the original
b.threshold( b, b.rect, new Point, "==", 0xff000000, 0x00000000 ); // test the pixels; if they're black, replace with transparence

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#threshold()

同样,当边缘定义良好时,这种方法效果最好。

5)使用过滤器

您可以使用applyFilter()创建新图片,使用BitmapFilter删除黑色图片。可能只有其他过滤器可以工作,但ShaderFilter肯定应该完成这项工作(你编写自己的着色器,所以你基本上可以做你想要的)。我对过滤器没有任何实际经验,所以我不能告诉你它们是如何工作的,但有些谷歌搜索应该给你必要的代码

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#applyFilter()

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/filters/ShaderFilter.html

6)使用photoshop(或同等版本)

最简单的方法;只需编辑您的图像即可删除黑色;更不用说了。)