AS3 BitmapData fillRect с прозрачностью не работает должным образом

Я пытаюсь использовать некоторые fillRects на 32-битных BitmapData (т.е. прозрачность = истина и цвет bg установлен на FFFF00FF (непрозрачный пурпурный). Например, я использую:

fillRect(rect, 0xFF0000FF);

Это нарисует непрозрачный синий прямоугольник, как и ожидалось, но...

fillRect(rect, 0x550000FF);

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

Если я установлю значение цвета на 0x000000FF, это даст мне базовую пурпурную на 100%, но вместо этого я получу 100% черного.

BitmapData создается с 32-битным ARGB, поэтому мне интересно, что здесь не так?

Кажется, это поведение по умолчанию AS3? После создания небольшого тестового класса он действительно ведет себя так, как я объяснил...

package 
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.geom.Rectangle;


    public class Main extends Sprite
    {
        public function Main()
        {
            stage.color = 0x000000;
            var bd:BitmapData = new BitmapData(400, 300, true, 0xFFFF00FF);
            var b:Bitmap = new Bitmap(bd);
            addChild(b);

            bd.fillRect(new Rectangle(0, 0, 200, 200), 0x000000FF);
        }
    }
}

Вы ожидаете, что прямоугольник, нарисованный с помощью fillRect, будет пурпурным, но он, очевидно, принимает цвет сцены bg. Теперь мой вопрос:

Есть ли способ получить желаемый эффект (альфа fillRect применяется к цвету bg растровых данных, а не к стадии Flash)?

1 ответ

Ваша проблема в предположении, что fillRect похож на инструмент в фотошопе, где вы можете нарисовать полупрозрачный прямоугольник, и он будет автоматически смешиваться.

Это НЕ, fillRect просто устанавливает все пиксели растрового изображения из указанной прямоугольной области в данный цвет.

Что вам нужно сделать, это создать полупрозрачное растровое изображение с желаемым размером и цветом, а затем объединить его с вашим рабочим растровым изображением (холст), используя, например, метод draw, как в этом упрощенном примере:

var whiteTransparent:BitmapData = new BitmapData(100, 100, true, 0x80FFffFF);
var blackCanvas:BitmapData = new BitmapData(400, 400, false, 0);

var canvas:Bitmap = new Bitmap(blackCanvas);

addChild(canvas);

blackCanvas.draw(whiteTransparent);

с уважением

Другие вопросы по тегам