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

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

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

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

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


person Robert Oschler    schedule 07.10.2010    source источник


Ответы (2)


В документации говорится:

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

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

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

person himself    schedule 07.10.2010

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

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

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

person Robert Oschler    schedule 07.10.2010