我将具有大量未使用空间的影片剪辑转换为位图,但似乎在转换过程中已将许多白色像素添加到位图中,因此无法正确显示背景。
我的问题是如何以最聪明的方式去除背景......去除每一个白色像素,如果是这样怎么做?如果可能的话,如何从影片剪辑生成一个 alphamap?还是我不知道的其他方式?
提前谢谢 =)
我将具有大量未使用空间的影片剪辑转换为位图,但似乎在转换过程中已将许多白色像素添加到位图中,因此无法正确显示背景。
我的问题是如何以最聪明的方式去除背景......去除每一个白色像素,如果是这样怎么做?如果可能的话,如何从影片剪辑生成一个 alphamap?还是我不知道的其他方式?
提前谢谢 =)
参考以下代码。此代码是如果像素为白色,则转换为透明色。
for(var i:int = 0; i<myBitmapData.width; i++)
{
for(var j:int = 0; j<myBitmapData.height; j++)
{
if(myBitmapData.getPixel(i,j) == 0xffffff)
{
var transparent:uint = 0x00000000;
myBitmapData.setPixel32(i, j, transparent);
}
}
}
您已经检查了以下代码。在测试之前,必须将颜色更改为红色或蓝色或绿色......你想要的阶段。
import flash.display.Sprite;
import flash.events.Event;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.events.MouseEvent;
var brush:Sprite =new Sprite();
brush.graphics.beginFill(0xffffff);
brush.graphics.drawRect(0,0,100,100);
brush.graphics.endFill();
//addChild(brush);
var myBitmap:Bitmap = new Bitmap(convertToBitmap(brush));
var bmd:BitmapData = myBitmap.bitmapData;
addChild(myBitmap);
for(var i:int = 0; i<bmd.width; i++)
{
for(var j:int = 0; j<bmd.height; j++)
{
if(bmd.getPixel(i,j) == 0xffffff)
{
var transparent_color:uint = 0x00000000;
bmd.setPixel32(i, j, transparent_color);
}
}
}
function convertToBitmap( clip:DisplayObject ):BitmapData
{
var bounds:Rectangle = clip.getBounds( clip );
var bitmap:BitmapData = new BitmapData( int( bounds.width + 0.5 ), int( bounds.height + 0.5 ), true, 0 );
bitmap.draw( clip, new Matrix(1,0,0,1,-bounds.x,-bounds.y) );
return bitmap;
}
另一种方法是在创建 BitmapData 对象时,使用 alpha 为 0 的 ARGB 颜色填充。这样您就不必遍历 BitmapData 并将每个像素设置为@bitmapdata 的答案。
var bitmapData:BitmapData = new BitmapData(100, 100, true, 0x00000000);
这是一个示例应用程序,它显示了这一点:
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Graphics;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
public class TestAS3 extends Sprite
{
private var drawingObject:Sprite = new Sprite();
private var bitmap:Bitmap = new Bitmap();
private var backgroundObject:Sprite = new Sprite();
public function TestAS3()
{
super();
stage.scaleMode=StageScaleMode.NO_SCALE;
stage.align=StageAlign.TOP_LEFT;
// draw something on the background, so we can verify the
// bitmap has transparency
var g:Graphics = backgroundObject.graphics;
g.beginFill(0xFF0000);
g.drawRect(0,0,200,200);
g.endFill();
addChild(backgroundObject);
// draw a black circle so we can make a bitmap out of it
g = drawingObject.graphics;
g.beginFill(0);
g.drawCircle(100,100,50);
g.endFill();
// create the bitmap data
// note use an ARGB color (here color is black, alpha is 0)
// to default the BitmapData to a transparent fill
var bmd:BitmapData = new BitmapData(200,200,true,0x00000000);
bmd.draw(drawingObject);
bitmap.bitmapData=bmd;
addChild(bitmap);
}
}
}