Flash 如何缩小精灵中的矩形以排除透明像素?

Flash 如何缩小精灵中的矩形以排除透明像素?,flash,actionscript-3,actionscript,Flash,Actionscript 3,Actionscript,我有一个Sprite,它包含由透明像素包围的不透明对象。我还有一个矩形,它表示要使用BitmapData.draw()渲染的精灵的一部分 问题是我获得的矩形也包含透明部分。如何将矩形缩小到只包含不透明部分而忽略透明环境 kapep的答案正是我想做的,但问题是源代码是一个Sprite,而不是BitmapData对象,并且我没有getColorBoundsRect()在Sprite上,您可以使用它 var mask:uint = 0xFF000000; // ignore rgb, use alph

我有一个
Sprite
,它包含由透明像素包围的不透明对象。我还有一个
矩形
,它表示要使用
BitmapData.draw()
渲染的
精灵
的一部分

问题是我获得的
矩形
也包含透明部分。如何将
矩形
缩小到只包含不透明部分而忽略透明环境

kapep的答案正是我想做的,但问题是源代码是一个
Sprite
,而不是
BitmapData
对象,并且我没有
getColorBoundsRect()
Sprite
上,您可以使用它

var mask:uint = 0xFF000000; // ignore rgb, use alpha only
var transparent = 0x00000000; 
var rect:Rectangle = imageBitmapData.getColorBoundsRect(mask, transparent, false);
要使用精灵的像素进行操作,需要先将其绘制到
BitmapData
(使用
BitmapData.draw
)。然后在使用
getColorBoundsRect
获得一个较小的矩形后,使用该矩形的尺寸创建一个新的位图数据。最后一步是使用,将矩形区域从第一个图像复制到新图像

var imageBitmapData:BitmapData = new BitmapData(image.width, image.height, true, 0);
imageBitmapData.draw(image);
// var rect =  ... as above
var resultBitmapData:BitmapData = new BitmapData(rect.width, rect.height, true, 0);
resultBitmapData.copyPixels(imageBitmapData, rect, new Point(0,0));
你可以用这个

var mask:uint = 0xFF000000; // ignore rgb, use alpha only
var transparent = 0x00000000; 
var rect:Rectangle = imageBitmapData.getColorBoundsRect(mask, transparent, false);
要使用精灵的像素进行操作,需要先将其绘制到
BitmapData
(使用
BitmapData.draw
)。然后在使用
getColorBoundsRect
获得一个较小的矩形后,使用该矩形的尺寸创建一个新的位图数据。最后一步是使用,将矩形区域从第一个图像复制到新图像

var imageBitmapData:BitmapData = new BitmapData(image.width, image.height, true, 0);
imageBitmapData.draw(image);
// var rect =  ... as above
var resultBitmapData:BitmapData = new BitmapData(rect.width, rect.height, true, 0);
resultBitmapData.copyPixels(imageBitmapData, rect, new Point(0,0));

我觉得你的问题有点让人困惑,但如果我理解正确,以下是你应该做的:

首先,使用
BitmapData.draw()
拍摄精灵的“图片”,将其放置在新的
BitmapData
实例中。然后,您需要找到透明区域的边界。对每个边分别执行此操作。从每个边缘开始,按固定间隔(例如每10个像素)查看像素,看它们是否都是透明的。如果是,则向中心移动一定数量的像素并重复。下面是一些示例代码(未测试!):

//位图数据已存在
变量bmd:BitmapData;//内容已存在
var isTransparent:Function=Function(bmd:BitmapData,x:uint,y:uint):布尔值
{
var pixelValue:uint=bmd.getPixel32(0,0);
var alphaValue:uint=pixelValue>>24&0xFF;
返回值(alphaValue==0);
};
//看右边
var curX:uint=bmd.width-1;
var区间:uint=10;
var迭代:uint=Math.ceil(bmd.height/间隔);
var transparentX:uint=curX+1;
var-stillTransparent:Boolean=true;
while(仍然透明)
{

对于(var i:uint=0;i我觉得你的问题有点困惑,但如果我理解正确,你应该做以下几点:

首先,使用
BitmapData.draw()
拍摄精灵的“图片”,将其放置在新的
BitmapData
实例中。然后,您需要找到透明区域的边界。分别为每个边执行此操作。从每个边开始,按固定间隔(例如,每10个像素)查看像素然后看看它们是否都是透明的。如果它们是透明的,则向中间移动一定数量的像素并重复。下面是一些示例代码(未测试!):

//位图数据已存在
var bmd:BitmapData;//内容已存在
var isTransparent:Function=Function(bmd:BitmapData,x:uint,y:uint):布尔值
{
var pixelValue:uint=bmd.getPixel32(0,0);
var alphaValue:uint=pixelValue>>24&0xFF;
返回值(alphaValue==0);
};
//看右边
var curX:uint=bmd.width-1;
var区间:uint=10;
var迭代:uint=Math.ceil(bmd.height/间隔);
var transparentX:uint=curX+1;
var-stillTransparent:Boolean=true;
while(仍然透明)
{

对于(var i:uint=0;iCaveat:这是一个“出乎意料的”响应。我忘记了
getColorBoundsRect
,根据您的需要,这可能会更有效率。警告:这是一个“出乎意料的”响应回答。我忘记了
getColorBoundsRect
,根据您的需要,这可能会更有效。问题是源代码不是
BitmapData
,而是
Sprite
@Radu更新了我的答案。不过,我并不认为与原始设置有什么区别,因为您也只有一个sprite和一个矩形。我想你无法避免在这里创建第二个BitmapData对象。这就是我试图避免的,创建第二个
BitmapData
。感谢解决方案,我将测试创建
BitmapData
并使用
copyPixels
是否比只绘制透明像素更快。问题是源代码不是一个
BitmapData
,而是一个
Sprite
@Radu更新了我的答案。不过,我看不出与原始设置有什么区别,在原始设置中,您也只有一个Sprite和一个矩形。我想您无法避免在这里创建第二个BitmapData对象。这就是我试图避免的,创建第二个
BitmapData
。感谢您提供的解决方案,我将测试创建
BitmapData
并使用
copyPixels
是否比仅绘制透明像素更快。