我将大量未使用空间的动画片段转换为位图,但似乎很多白色像素在转换过程中已添加到位图中,因此背景将不会正确显示。从位图中移除白色像素
我的问题是如何去除背景的最聪明的方法... 删除每一个白色像素,如果是的话如何做到这一点?如果可能的话, 从动画片段生成一个alphamap如何? 或其他我不知道的方式?
thx预先=)
我将大量未使用空间的动画片段转换为位图,但似乎很多白色像素在转换过程中已添加到位图中,因此背景将不会正确显示。从位图中移除白色像素
我的问题是如何去除背景的最聪明的方法... 删除每一个白色像素,如果是的话如何做到这一点?如果可能的话, 从动画片段生成一个alphamap如何? 或其他我不知道的方式?
thx预先=)
参考下面的代码。此代码是如果像素为白色,则转换为透明色。
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对象时,与一个ARGB颜色谁的alpha为0。这样,您就不必遍历的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);
}
}
}
谢谢man =) 我完全不理解它,但它看起来很像它的工作原理,会在接下来的几分钟里玩!感谢您的帮助! – tschery
这真的很简单(只有1行),我只是添加了一个愚蠢的例子。创建BitmapData时,给它一个透明的填充,而不是默认的填充。 –
THX,这就是我想过,但不知道如何编码,但你真的认为这是最快/最好的方法是什么? – tschery
我编辑后。请检查。你已经检查过这个'bmd.setPixel32(...)'。 –