Flash 修剪透明PNG周围的空白

Flash 修剪透明PNG周围的空白,flash,actionscript-3,Flash,Actionscript 3,因此,我设法让自己陷入这样的境地:需要在舞台上放置一个装满图像(各种产品的透明图像)的数据库,所有这些图像都需要按照产品的高度对齐 我的问题是,产品的png是“浮动”的,我无法控制它在png中的位置(顶部可能很紧,底部可能有很多空间,反之亦然) 是否有人知道一种现有的方法来找出png的“真实”高度(宽度是额外的)。我曾想过循环浏览位图数据并进行检查,但不知道是否有人已经发明了这个轮子 例如/可以使用BitmapData类getColorBoundsRect()的方法来获取不透明内容的矩形。文档中

因此,我设法让自己陷入这样的境地:需要在舞台上放置一个装满图像(各种产品的透明图像)的数据库,所有这些图像都需要按照产品的高度对齐

我的问题是,产品的png是“浮动”的,我无法控制它在png中的位置(顶部可能很紧,底部可能有很多空间,反之亦然)

是否有人知道一种现有的方法来找出png的“真实”高度(宽度是额外的)。我曾想过循环浏览位图数据并进行检查,但不知道是否有人已经发明了这个轮子


例如/

可以使用BitmapData类getColorBoundsRect()的方法来获取不透明内容的矩形。文档中也给出了此示例:

谢谢,
Alistair

正如Alistair所说,getColorBoundsRect最终将是您的最佳选择

我没有过多地研究它,但我不确定getColorBoundsRect是否允许您“选择所有非100%alpha-ed像素”。如果没有,您可以轻松地使用BitmapData.threshold方法进入该阶段


我会复制位图,对其运行阈值方法,将所有非alpha-ed像素变成亮绿色,然后运行getColorBoundsRect,选择刚刚创建的所有绿色像素。

我最终找到的解决方案如下,很可能不是最有效的方法,但它可以工作

    /**
     * Cuts off the transparency around a bitmap, returning the true width and height whilst retaining transparency
     *  
     * @param input Bitmap
     * 
     */
    private function trimTransparency(input:BitmapData,colourChecker:uint = 0x00FF00):Bitmap {

        //Keep a copy of the original
        var orignal:Bitmap = new Bitmap(input);

        //Clone the orignal with a white background
        var clone:BitmapData = new BitmapData(orignal.width, orignal.height,true,colourChecker);
        clone.draw(orignal);

        //Grab the bounds of the clone checking against white
        var bounds:Rectangle = clone.getColorBoundsRect(colourChecker, colourChecker, false);

        //Create a new bitmap to return the changed bitmap
        var returnedBitmap:Bitmap = new Bitmap();
        returnedBitmap.bitmapData = new BitmapData(bounds.width, bounds.height,true,0x00000000);
        returnedBitmap.bitmapData.copyPixels(orignal.bitmapData,bounds, new Point(0,0));    
        return returnedBitmap;


    }

这是我提出的解决方案,以防任何人需要:

    public static function trimAlpha(source:BitmapData):BitmapData {
        var notAlphaBounds:Rectangle = source.getColorBoundsRect(0xFF000000, 0x00000000, false);
        var trimed:BitmapData = new BitmapData(notAlphaBounds.width, notAlphaBounds.height, true, 0x00000000);
        trimed.copyPixels(source, notAlphaBounds, new Point());
        return trimed;  
    }

有趣的问题-我认为双向循环是你最好的选择是的,我只是相信我不会是第一个需要双向透明度检查的人。但如果没有,我会继续玩下去。谢谢Trevor,发布了我的解决方案,它与您的主题相同,但没有超出阈值。事实证明,您可以只替换背景,然后在负空白处运行getColorBoundsRect。我会避免使用白色作为背景填充。。。如果你有一个带有白色边框的图像,会发生什么呢?没错,白色边框会搞乱这个大样式。嗯,我将进一步研究它,可能在输入旁边有另一个默认为绿色的颜色填充变量。不错。