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
是否比仅绘制透明像素更快。