Delphi 6: Как создать растровое изображение с TextOut, имеющим альфа-канал? - PullRequest
1 голос
/ 07 октября 2010

Я опишу мою общую цель на случай, если вопрос, который я задал, не в лучшей форме, чтобы получить ответ, который я ищу. У меня есть сфера слов или «шар слов», который вращается вокруг оси X. Поскольку слова вращаются назад (координата Z переходит от -1 к 1, спереди назад), я намереваюсь изменить размер и непрозрачность каждого слова, чтобы слова в "фронте" были на 100% непрозрачными и полноразмерными, а слова сзади меньше и прозрачнее. Я бы предпочел сделать это с прямым кодом Delphi и избегать таких вещей, как Direct3D и т. Д. У меня уже есть код вращения, работающий нормально. Мне просто нужно реализовать идею перцептуального затенения на основе Z-координат.

Когда я создаю слово ball, я динамически создаю компонент TImage для каждого слова. Я «печатаю» слово в растровое изображение TImage, используя метод TCanvas.TextOut () по центру. Я намереваюсь использовать BitBlt, чтобы скопировать это растровое изображение в правильное местоположение в основном Canvas, содержащем слово ball, потому что BitBlt быстр и может изменять размеры растровых изображений на лету, удовлетворяя одному из требований для моей операции перетекания затенения.

Но я не знаю лучшего способа облегчить альфа-смешение. Я знаю, что в Windows есть вызов AlphaBlend (), и его использование довольно простое. Но мне нужно знать, как создать растровое изображение, которое является копией компонента TImage для каждого слова, имеющего альфа-канал. Обратите внимание, что в моем случае все растровое изображение будет иметь одинаковое значение для альфа-канала, поскольку я хочу, чтобы непрозрачность применялась равномерно ко всему слову на основе его координаты Z.

Имеет ли динамически созданный компонент TImage с растровым изображением, созданным с помощью TCanvas.TextOut (), альфа-канал? Если нет, то как мне его создать или создать копию растрового изображения TImage в реальном времени, у которого есть альфа-канал для передачи в вызов AlphaBlend ()? Если есть лучший способ сделать все это, просто дайте мне знать.

Ответы [ 2 ]

2 голосов
/ 07 октября 2010

Документация гласит:

Элемент SourceConstantaAlpha в BLENDFUNCTION указывает значение альфа-прозрачности, которое будет использоваться во всем исходном растровом изображении. Значение SourceConstantaAlpha объединяется с любыми альфа-значениями для каждого пикселя. Если SourceConstantaAlpha равен 0, предполагается, что изображение является прозрачным. Установите для параметра SourceConstantaAlpha значение 255 (что указывает на непрозрачность изображения), если вы хотите использовать только альфа-значения на пиксель.

Так что я полагаю, что ваше изображение не обязательно должно быть в каком-либо специальном формате, если вы просто хотите, чтобы все изображение было прозрачным.

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

1 голос
/ 07 октября 2010

Я нашел эту ссылку, которая дает хороший пример того, как сделать альфа-смешивание в Delphi 6, и теперь у меня она работает:

http://www.delphi -central.com / учебники / AlphaBlend.aspx

Это очень близко к использованию BitBlt () или StretchBlt () по параметрам, за исключением последнего параметра, который является структурой альфа-смешения и очень прост для понимания. Объедините это с комментарием «себя» выше, и у вас есть все, что вам нужно для альфа-смешения.

...