Получить BitmapData из displayObject включал прозрачную область и область эффекта - PullRequest
1 голос
/ 05 августа 2011

У меня есть эта функция:

    public static function cloneDpObj(target:DisplayObject):Bitmap
    {
        var duplicate:Bitmap;

        var tBitData:BitmapData = new BitmapData(target.width, target.height);
        tBitData.draw(target);
        duplicate = new Bitmap(tBitData);

        return duplicate;
    }

для клонирования целевого объекта displayObject (MovieClip или Sprite) и возврата растрового объекта.

Может получить растровое изображение из целевого объекта, но, похоже, неполучить всю область изображения.

По ширине и высоте целевого объекта, но целевой объект в дизайне был применен эффектом свечения, поэтому мой вопрос, можем ли мы получить весь вид растровых данных изобъект отображения?

Ответы [ 4 ]

4 голосов
/ 05 августа 2011

BitmapData.draw() делает снимок заданного объекта, удаляя все преобразования и фильтры, примененные на сцене. Результирующее изображение показывает объект в том виде, в каком он присутствует в вашей библиотеке фильмов.

Существует два основных варианта рисования экранных объектов с преобразованиями и / или фильтрами.

  1. Вы можете применить все преобразования во время рисования с параметром матрицы для BitmapData.draw(). После рисования вы можете применить фильтры к полученному растровому изображению с помощью BitmapData.applyFilter().
  2. Просто нарисуйте родительский контейнер, а не сам объект.

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

// bounds and size of parent in its own coordinate space
var rect:Rectangle = target.parent.getBounds(target.parent);
var bmp:BitmapData = new BitmapData(rect.width, rect.height, true, 0);

// offset for drawing
var matrix:Matrix = new Matrix();
matrix.translate(-rect.x, -rect.y);

// Note: we are drawing parent object, not target itself: 
// this allows to save all transformations and filters of target
bmp.draw(target.parent, matrix);
1 голос
/ 08 августа 2011

Большое спасибо всем, кто занял драгоценное время, ответил на мой вопрос. Я улучшил эту функцию, но я стал лучше, но я заметил, что ширина результата захвата составляет 1 пиксель со смещением, поэтому я решил добавить 1 пиксель к ширине растровых данных, я знаю, что это не очень хорошая практика. потому что я должен сделать это сейчас, я еще не знаю проблему. Вот как наша функция сейчас:

 public static function cloneDpObj(target:DisplayObject, optWidth:Number = -1, optHeight:Number = -1):Bitmap
    {
        var duplicate:Bitmap;

        if (!target.parent) {
            var tempSprite:Sprite = new Sprite;
            tempSprite.addChild(target);
        }

        var rect:Rectangle = target.parent.getBounds(target.parent);
        var bmp:BitmapData = new BitmapData(rect.width + 1, rect.height, true, 0);

        // offset for drawing
        var matrix:Matrix = new Matrix();
        matrix.translate( -rect.x, -rect.y);

        // Note: we are drawing parent object, not target itself: 
        // this allows to save all transformations and filters of target
        bmp.draw(target.parent, matrix);

        duplicate = new Bitmap(bmp);

        return duplicate;
    } 
1 голос
/ 05 августа 2011

Вам необходимо вычислить площадь / прямоугольник вашего объекта DisplayObject, включая площадь, занятую применяемым фильтром.К счастью, вы можете сделать это с помощью встроенной функциональности, используя метод generateFilterRect () класса BitmapData.

Кроме того, по другим причинам, если вам нужно преобразование вашего DisplayObject, примененноев моментальный снимок BitmapData можно передать .transform исходного объекта DisplayObject. concatenatedMatrix в качестве второго параметра метода draw () BitmapData.

0 голосов
/ 05 августа 2011

Я бы на самом деле выбрал первый вариант Nox как более простой подход, и изменение вашей функции для этого должно занять только одну дополнительную строку кода:

public static function cloneDpObj(target:DisplayObject):Bitmap
{
    var duplicate:Bitmap;

    var tBitData:BitmapData = new BitmapData(target.width, target.height);
    tBitData.draw(target);
    duplicate = new Bitmap(tBitData);
    //add the filters
    duplicate.filters = target.filters;

    return duplicate;
}
...