Как вырезать форму из BitmapData? - PullRequest
2 голосов
/ 05 декабря 2010

У меня есть заполненная форма и BitmapData такой же ширины и высоты, что и ограничивающая рамка формы. Мне нужно вырезать Shape из BitmapData (в основном, вывести BitmapData на форму ...)

Я использую довольно хакерский метод:

        public static function cutPoly(img:BitmapData, s:Shape, bounds:Bounds):BitmapData {
        var temp:BitmapData = new BitmapData(bounds.width, bounds.height, true);
        Main.inst.stageQuality("low"); //hack to kill anti-aliasing
        temp.draw(s,new Matrix());
        Main.inst.stageQuality("high"); // end hack

        //0xFF00FF00 is the color of the shape
        makeColTrans(temp,0xFF00FF00); //makes the color transparent :P
        //return temp;
        img.draw(temp);
        //img.draw(temp);
        temp.dispose();
        makeColTrans(img, 0xFFFFFFFF);
        return img;
    }

Мне было интересно, есть ли лучший метод ... который не просто взломать.

Ответы [ 4 ]

5 голосов
/ 06 декабря 2010

Это также можно считать хаком, но вы можете добавить растровое изображение и (нарисованную) форму в спрайте контейнера, замаскировать растровое изображение с помощью формы и снова нарисовать полученное изображение. Единственное преимущество, которое вы получите, это использование собственных алгоритмов рисования среды выполнения, и это только в том случае, если ваш makeColTrans сканирует все растровые изображения попиксельно.

отредактировано для примера кода:

    public static function cutPoly(sourceBitmapData:BitmapData, maskShape:Shape, bounds:Rectangle):BitmapData {
        // you might not need this, supplying just the sourceBitmap to finalBitmapData.draw(), it should be tested though.
        var sourceBitmapContainer:Sprite = new Sprite();
        sourceBitmapContainer.addChild(sourceBitmap);
        sourceBitmapContainer.addChild(maskShape);

        var sourceBitmap:Bitmap = new Bitmap(sourceBitmapData);
        maskShape.x = bounds.x;
        maskShape.y = bounds.y;
        sourceBitmap.mask = maskShape;

        var finalBitmapData:BitmapData = new BitmapData(bounds.width, bounds.height, true, 0x00ffffff);
        // or var finalBitmapData:Bitmap = new BitmapData(maskShape.width, maskShape.height); not too sure about the contents of the bounds...
        finalBitmapData.draw(sourceBitmapContainer);

        return finalBitmapData;
    }
1 голос
/ 06 декабря 2010

второй аргумент метода draw () принимает матрицу преобразования - здесь вы можете указать смещения, поворот, наклон и т. Д.затем используйте этот объект bitmapdata в качестве источника beginBitmapFill для фигуры.

0 голосов
/ 25 февраля 2011

Если вы хотите использовать этот алгоритм «cookie-cut» в основном только из объектов BitmapData, учтите следующее:

var bmp:BitmapData = pSourceBmp.clone();
var alphaBmp:BitmapData = new BitmapData(shape.width, shape.height, true, 0);

alphaBmp.draw( shape );

var alphaOrigin:Point = new Point();
var pasteOrigin:Point = new Point();

bmp.copyPixels( bmp, bmp.rect, pasteOrigin, alphaBmp, alphaOrigin, true);

ПРИМЕЧАНИЕ: Этот код не тестировался.

Я использовал что-то подобное в движке Blitting для «вырезания печенья», и он прекрасно работал для извлечения фигур из любой заданной векторной графики.Интересная альтернатива маскам.

0 голосов
/ 23 декабря 2010

Соответствует ли цвет вокруг формы?Если это так, вы можете найти первый экземпляр этого цветного пикселя и floodFill () битовые данные с 0x00000000 по этой координате, а затем нарисовать результат в новые прозрачные битовые данные.

edit

Вот еще один пример использования порогов.Это далеко от совершенства, но это поможет вам пройти часть пути.В этом случае класс «Плитка» - это просто изображение, которое вы указали в своем вопросе с идентификатором связи.

import flash.display.BitmapData;
import flash.geom.Point;
import flash.display.Bitmap;

var sample : Tile = new Tile();

var alphaBitmap : BitmapData = new BitmapData ( sample.width, sample.height, true, 0x00000000 );
    alphaBitmap .draw ( sample );
    alphaBitmap.threshold( alphaBitmap, alphaBitmap.rect, new Point(), "<", 0xFFEFEFEF, 0xFFFFFFFF, 0xFFFFFFFF );
    alphaBitmap.threshold( alphaBitmap, alphaBitmap.rect, new Point(), "!=", 0xFFFFFFFF, 0x00000000 );

    addChild ( new Bitmap ( alphaBitmap ) );

var source : Tile = new Tile();
var output : BitmapData = new BitmapData ( sample.width, sample.height, true, 0x00000000 );
    output.copyPixels( source, source.rect, new Point(), alphaBitmap );

var outputBitmap : Bitmap = new Bitmap ( output );
    outputBitmap.x = outputBitmap.width;

addChild ( outputBitmap );
...