Обрезать пробелы вокруг прозрачного PNG - PullRequest
3 голосов
/ 22 октября 2010

Итак, мне удалось застрять в ситуации, когда на сцене должна быть размещена база данных, полная изображений (прозрачных изображений различных продуктов), причем все они должны быть выровнены одинаково по высоте продуктов..

Моя проблема в том, что png продуктов «плавают», и я не могу контролировать, где они находятся в png (может быть плотно вверху и много места внизу, и наоборот).)

Кто-нибудь знает существующий способ узнать «истинную» высоту png (ширина является дополнительной).Я думал о циклическом просмотре растровых данных и проверке, но мне было интересно, кто-нибудь уже изобрел это колесо?

например, Пример с комнатой сверху / Пример без него, правда

Ответы [ 4 ]

6 голосов
/ 22 октября 2010

вы можете использовать метод класса BitmapData getColorBoundsRect (), чтобы получить прямоугольник непрозрачного содержимого. В документации также приведен этот пример:

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/BitmapData.html

Спасибо, Алистер

3 голосов
/ 25 октября 2010

Как говорит Алистер, getColorBoundsRect в конечном итоге будет вашим лучшим вариантом.

Я не слишком изучил это, но я не уверен, позволяет ли getColorBoundsRect "выбрать все не 100% альфа-пиксели". Если этого не произойдет, вы можете легко использовать метод BitmapData.threshold для перехода на этот этап.

Я бы сделал что-то вроде дублирования растрового изображения, запустил для него метод порога, сделав все пиксели без альфа-цвета ярко-зеленым, затем запустил getColorBoundsRect, выбрав все зеленые пиксели, которые вы только что создали.

1 голос
/ 18 июля 2013

Это решение, которое я придумал, на случай, если кому-то понадобится:

    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;  
    }
1 голос
/ 26 октября 2010

Решение, к которому я в итоге пришел, было ниже, скорее всего, не самый эффективный способ, но он работает.

    /**
     * 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;


    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...