2010-10-07 69 views
1

我會描述我的總體目標,以防我提出的問題不是以最佳形式獲得我正在尋找的答案。我有一個圍繞X軸旋轉的單詞或「單詞球」。當字旋轉到後面(Z座標從-1到1,從前到後)時,我打算改變每個單詞的大小和不透明度,以便「前」中的單詞是100%不透明,全尺寸和單詞在後面是更小,有點透明。我寧願用直接的Delphi代碼來做這件事,並避免像Direct3D這樣的事情,我已經有了旋轉代碼工作正常。我只需要實現基於Z座標的感性着色思路。Delphi 6:如何創建一個帶有Alpha通道的TextOut的位圖?

當我創建單詞球時,我爲每個單詞動態創建一個TImage組件。我使用TCanvas.TextOut()方法以居中的方式「打印」了單詞到TImage位圖。我打算使用BitBlt將該位圖複製到包含單詞球的主Canvas中的正確位置,因爲BitBlt速度很快並且可以即時調整位圖大小,從而滿足我感知着色操作的要求之一。

但我不知道促進Alpha混合的最佳方式。我知道Windows有AlphaBlend()調用,它看起來相當簡單易用。但我需要知道如何創建一個具有alpha通道的每個單詞TImage組件副本的位圖。請注意,在我的情況下,整個位圖將具有統一的alpha通道值,因爲我希望根據它的Z座標將不透明度統一應用於整個單詞。

通過使用TCanvas.TextOut()創建的位圖動態創建的TImage組件是否具有Alpha通道?如果不是,我該如何創建一個,或實時創建一個TImage位圖副本,並將Alpha通道傳遞給AlphaBlend()調用?如果有更好的方法做到這一點,請讓我知道。

回答

2

documentation說:

BLENDFUNCTION的SourceConstantaAlpha構件指定要對整個源位圖中使用的alpha透明度值。 SourceConstantaAlpha值與任何每個像素的alpha值組合在一起。如果SourceConstantaAlpha爲0,則認爲圖像是透明的。當您只想使用每像素的alpha值時,將SourceConstantaAlpha值設置爲255(表示圖像不透明)。

所以我想你的圖像不必以任何特殊的格式,如果你只是想要一個完整的圖像不變的透明度。

另一方面,我不認爲這就是你想要的。試想一個文本與另一個矩形區域重疊的矩形區域:儘管矩形的某些部分可能沒有文本,但它們仍然會以半透明白色或任何一種背景顏色繪製。

1

我發現這個鏈接給出了怎麼辦Alpha混合在Delphi 6堅實的例子,現在我有工作:

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

這是非常接近使用的BitBlt()或StretchBlt()參數明智,除了最後一個參數是alpha混合結構,並且非常容易理解。把它和上面的「自己」的評論結合起來,你就有了所有你需要做的Alpha混合。

相關問題