我有这个功能:
public static function cloneDpObj(target:DisplayObject):Bitmap
{
var duplicate:Bitmap;
var tBitData:BitmapData = new BitmapData(target.width, target.height);
tBitData.draw(target);
duplicate = new Bitmap(tBitData);
return duplicate;
}
克隆目标displayObject(MovieClip或Sprite)并返回Bitmap Object。
它可以从目标对象获取位图,但它似乎没有得到图像的所有区域。
通过给出目标对象的宽度和高度,但是设计中的目标对象是由Glow Effect应用的,那么我的问题是我们可以从显示对象获得bitmapdata的所有视图吗?
答案 0 :(得分:4)
BitmapData.draw()
获取给定对象的快照,删除舞台上应用的所有变换和过滤器。生成的图像显示电影库中存在的对象。
使用转换和/或过滤器绘制显示对象时有两个基本选项。
BitmapData.draw()
的矩阵参数在绘图期间应用所有变换。绘制后,您可以使用BitmapData.applyFilter()
将结果应用于生成的位图。我通常选择后者。这非常简单。有一些缺点:如果您选择第二种方法,您的目标必须具有父显示列表,您可以绘制驻留在父容器中的不需要的内容。 (但是,这些缺点很容易消除。)
// bounds and size of parent in its own coordinate space
var rect:Rectangle = target.parent.getBounds(target.parent);
var bmp:BitmapData = new BitmapData(rect.width, rect.height, true, 0);
// offset for drawing
var matrix:Matrix = new Matrix();
matrix.translate(-rect.x, -rect.y);
// Note: we are drawing parent object, not target itself:
// this allows to save all transformations and filters of target
bmp.draw(target.parent, matrix);
答案 1 :(得分:1)
您需要计算DisplayObject的面积/矩形,包括应用的滤镜所占的面积。幸运的是,通过使用BitmapData类的generateFilterRect()方法,您可以使用内置功能。</ p>
此外,由于其他原因,如果您需要将DisplayObject的变换应用于BitmapData快照,则可以将源DisplayObject的.transform。concatenatedMatrix作为BitmapData的draw()方法的第二个参数传递。
答案 2 :(得分:1)
非常感谢大家花时间回答我的问题。我改进了这个功能,但我更好,但我注意到捕获结果的宽度是1像素偏移,所以我决定在bitmapdata的宽度上加1个像素,我知道这不是一个好习惯。因为我现在必须这样做,我还不知道这个问题。以下是我们现在的功能:
public static function cloneDpObj(target:DisplayObject, optWidth:Number = -1, optHeight:Number = -1):Bitmap
{
var duplicate:Bitmap;
if (!target.parent) {
var tempSprite:Sprite = new Sprite;
tempSprite.addChild(target);
}
var rect:Rectangle = target.parent.getBounds(target.parent);
var bmp:BitmapData = new BitmapData(rect.width + 1, rect.height, true, 0);
// offset for drawing
var matrix:Matrix = new Matrix();
matrix.translate( -rect.x, -rect.y);
// Note: we are drawing parent object, not target itself:
// this allows to save all transformations and filters of target
bmp.draw(target.parent, matrix);
duplicate = new Bitmap(bmp);
return duplicate;
}
答案 3 :(得分:0)
我实际上将Nox的第一个选项作为更简单的方法,并且修改你的功能只需要额外的一行代码:
public static function cloneDpObj(target:DisplayObject):Bitmap
{
var duplicate:Bitmap;
var tBitData:BitmapData = new BitmapData(target.width, target.height);
tBitData.draw(target);
duplicate = new Bitmap(tBitData);
//add the filters
duplicate.filters = target.filters;
return duplicate;
}