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);
с уважением