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

Я опишу свою общую цель на случай, если вопрос, который я задал, не в лучшей форме, чтобы получить ответ, который я ищу. У меня есть сфера слов или "шар слов", который вращается вокруг оси 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 ответа

Решение

В документации сказано:

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

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

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

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

http://www.delphi-central.com/tutorials/AlphaBlend.aspx

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

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