1

私が尋ねた質問が、探している答えを得るのに最適な形式ではない場合に備えて、私の全体的な目標について説明します。X 軸を中心に回転する単語または「単語ボール」の球体があります。単語が後ろに回転するにつれて (Z 座標は -1 から 1、前から後ろに移動します)、各単語のサイズと不透明度を変更して、「前」の単語が 100% 不透明でフルサイズの単語になるようにします。後ろは小さく、やや透明です。私はこれをまっすぐな Delphi コードで行い、Direct3D などを避けたいと思います。回転コードは既に正常に動作しています。Z 座標ベースの知覚シェーディングのアイデアを実装するだけです。

単語ボールを作成するとき、単語ごとに TImage コンポーネントを動的に作成します。TCanvas.TextOut() メソッドを中央に配置して、単語を TImage ビットマップに「出力」します。BitBlt を使用して、そのビットマップをメイン Canvas 内の単語ボールを保持する正しい場所にコピーするつもりです。BitBlt は高速で、オンザフライでビットマップのサイズを変更できるため、私の知覚シェーディング操作の要件の 1 つを満たしています。

しかし、アルファブレンディングを容易にする最善の方法がわかりません。Windows には AlphaBlend() 呼び出しがあることを知っており、使用するのはかなり簡単です。しかし、アルファ チャネルを持つ単語ごとの TImage コンポーネントのコピーであるビットマップを作成する方法を知る必要があります。私の場合、Z座標に基づいて単語全体に不透明度を均一に適用したいので、ビットマップ全体のアルファチャンネルの値は均一になることに注意してください。

TCanvas.TextOut() を使用して作成されたビットマップを持つ動的に作成された TImage コンポーネントには、アルファ チャネルがありますか? そうでない場合、AlphaBlend() 呼び出しに渡されるアルファ チャネルを持つ TImage ビットマップのコピーをリアルタイムで作成または作成するにはどうすればよいですか? これをすべて行うためのより良い方法があれば、私に知らせてください。

4

2 に答える 2

2

ドキュメントには次のように記載されています。

BLENDFUNCTION の SourceConstantaAlpha メンバーは、ソース ビットマップ全体で使用されるアルファ透明度値を指定します。SourceConstantaAlpha 値は、ピクセルごとのアルファ値と結合されます。SourceConstantaAlpha が 0 の場合、画像は透明であると見なされます。ピクセルごとのアルファ値のみを使用する場合は、SourceConstantaAlpha 値を 255 (画像が不透明であることを示します) に設定します。

したがって、画像全体を一定の透明度にしたいだけであれば、画像を特別な形式にする必要はないと思います。

一方で、それはあなたが望んでいることではないと思います。テキストが別の領域と重なっている 1 つの四角形の領域を想像してみてください。四角形の一部にテキストが含まれていない場合でも、半透明の白、または背景として指定した色で描画されます。

于 2010-10-07T15:41:58.077 に答える
1

Delphi 6でアルファブレンディングを行う方法の確かな例を提供するこのリンクを見つけましたが、今ではそれが機能しています:

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

BitBlt() または StretchBlt() のパラメータ単位の使用に非常に近いですが、最後のパラメータはアルファ ブレンド構造であり、非常に理解しやすいものです。それを上記の「彼自身」によるコメントと組み合わせると、アルファ ブレンディングを行うために必要なすべてが得られます。

于 2010-10-07T18:11:56.990 に答える