Вот способ сделать это, используя динамическое текстовое поле в качестве маски.Хитрость заключается в том, чтобы инвертировать альфа-канал текстового поля.Этот класс создает цвет bitmapData с прозрачностью.Затем он создает текстовое поле.Затем он создает bitmapData для рисования текстового поля. Он рисует текст, а затем переворачивает альфа-канал текста, чтобы вырезать то, что было показано ранее.Мы применяем альфа-канал текстовых растровых данных к цветному растровому изображению, чтобы из цвета был вырезан текст.В заключение.мы добавляем растровое изображение, чтобы показать нашу работу.(так что вы можете видеть, что в colro вырезан текст.) Если вы запустите его на своем компьютере, он будет выглядеть немного неровно, потому что он будет использовать шрифт по умолчанию без анилирования.Но вы можете легко создать собственное текстовое поле с собственным шрифтом и нарисовать его вместо этого.Тогда это будет выглядеть гладко.
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BitmapDataChannel;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TextEvent;
import flash.geom.ColorTransform;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.text.TextField;
/**
* ...
* @author Zachary Foley
*/
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
// Make a red square bitmapdata that allows transparency.
var color:BitmapData = new BitmapData(400, 400, true, 0xFF990000);
var word:TextField = new TextField;
word.text = "HELLO MASK";
var textMask:BitmapData = new BitmapData(word.width, word.height, true, 0x00000000);
textMask.draw(word);
textMask = invert(textMask);
var colorHolder:Bitmap = new Bitmap(color);
addChild(colorHolder);
color.copyChannel(textMask, textMask.rect, new Point(0, 0), BitmapDataChannel.RED, BitmapDataChannel.ALPHA);
}
private function invert(oldBmp:BitmapData):BitmapData {
var source:BitmapData = oldBmp;
var destination_bitmap:BitmapData = source.clone();
var rectan:Rectangle = new Rectangle(0, 0, source.width, source.height);
// Replace all transparent pixels with a solid color
destination_bitmap.threshold(source, rectan, new Point(), "==", 0x00000000,0xFFFF0000);
// Replace all the pixels greater than 0xf1f1f1 by transparent pixels
destination_bitmap.threshold(source, rectan, new Point(), "==", 0xff656565,0x0000FF00);
return destination_bitmap;
}
}
}