AS3 bitmapdata.draw без добавления в список отображения / этап

Я хочу иметь возможность преобразовывать текст HTML в растровое изображение для использования в AlivePDF. Мое тестирование хорошо работает с TextArea или если компонент находится в рабочей области или виден. Но я хочу иметь возможность обрабатывать текстовые блоки, которые не обязательно отображаются на экране. Кто-нибудь знает как это сделать?

Что у меня пока не получается

    public static function rasterizeText( text:String, width:int = 100, height:int = 100, x:int = 0, y:int = 0 ):BitmapData {
        var textRenderer:TextArea = new TextArea();
        textRenderer.width = width;
        textRenderer.height = height;
        textRenderer.htmlText = text;

        var bitdata:BitmapData = new BitmapData(width, height, true, 0xFF000000)
        bitdata.draw( textRenderer );
        return bitdata;
    }

person Lex    schedule 03.08.2012    source источник
comment
Я не понимаю, как можно сохранить данные растрового изображения, не сгенерировав их предварительно. Попробуйте визуализировать текст в какой-то момент вне сцены, где он не виден, а затем удалите его позже.   -  person loxxy    schedule 03.08.2012


Ответы (2)


Ваш код должен работать нормально. Нет необходимости добавлять textRenderer на сцену, чтобы отрисовать его в BitmapData. Вы рисуете свой textRenderer на сплошном черном фоне. Может у вас текст тоже черный и поэтому вы его не видите?

Попробуйте изменить 0xFF000000, например, на 0xFFFF0000 и посмотрите, появится ли текст.

person sanchez    schedule 03.08.2012
comment
Я не думаю, что это проблема с цветом, кажется, что это работает только после того, как я добавил его в рабочую область (ниже работает, удалить холст и рисовать рендерер нет) public function rasterizeText( text:String, width:int = 100, height:int = 100 ):BitmapData { var textRenderer:TextArea = new TextArea(); textRenderer.width = width; textRenderer.height = height; textRenderer.textFlow = TextConverter.importToFlow(text, TextConverter.TEXT_FIELD_HTML_FORMAT); canvas.rawChildren.addChild( textRenderer ); var bitdata:BitmapData = new BitmapData( width, height, false ) bitdata.draw( canvas ); return bitdata; } - person Lex; 06.08.2012

Нет, дело не в цвете. Также у меня был установлен цвет FF000000, который, по крайней мере, должен был отображаться черным. TextArea, похоже, не очень хорошо работает с растровыми изображениями, хотя TextField работает отлично.

Изменить: я предполагаю, что TextArea не работает как искра или mx, потому что это штука FlexSprite, которая действует иначе, чем обычные спрайты AS3. Они отложат рендеринг до тех пор, пока не будут добавлены в список отображения.

Рабочая функция:

public function rasterizeText( text:String,
        width:int = 100, height:int = 100 ):BitmapData {
    var tf:TextField = new TextField();
    tf.multiline = true;
    tf.wordWrap = true;
    tf.width = width;
    tf.height = height;
    tf.htmlText = text;
    var bd:BitmapData = new BitmapData(width, height, true,0x00000000);
    bd.draw(tf);
    return bd;
}

Это не сработало (я пробовал компоненты mx & spark textarea):

public function rasterizeText( text:String,
        width:int = 100, height:int = 100 ):BitmapData {
    var textRenderer:TextArea = new TextArea();
    textRenderer.width = width;
    textRenderer.height = height;
    textRenderer.textFlow = TextConverter.importToFlow( text, TextConverter.TEXT_FIELD_HTML_FORMAT );
    var bitdata:BitmapData = new BitmapData( width, height, false, 0xFF000000 )
    bitdata.draw( textRenderer );
    return bitdata;
}

Однако это будет работать при рисовании из сцены:

public function rasterizeText( text:String,
        width:int = 100, height:int = 100 ):BitmapData {
    var textRenderer:TextArea = new TextArea();
    textRenderer.width = width;
    textRenderer.height = height;
    textRenderer.textFlow = TextConverter.importToFlow( text, TextConverter.TEXT_FIELD_HTML_FORMAT );
    canvas.addElement( textRenderer );
    var bitdata:BitmapData = new BitmapData( width, height, false, 0xFF000000 )
    bitdata.draw( canvas );
    return bitdata;
}
person Lex    schedule 06.08.2012