2009-08-27 67 views
8

我一直在使用GDI創建位圖+。我是到使用GDI Drawtext.Using的drawText該位圖繪製文本我無法適用tranparency。 任何幫助或代碼將不勝感激。透明度文本在GDI

+1

首選語言? C,C++,VB.net,C#? – 2009-08-27 10:37:22

+0

首選將是純Windows API/C++ – VideoDev 2009-08-27 13:10:56

+1

是GDI +一個錯字? – 2009-08-27 20:27:29

回答

13

如果你想繪製文本沒有背景填充,SetBkMode(hdc,TRANSPARENT)會告訴GDI繪製文本何時離開的背景。


要實際渲染帶alpha的文本的前景色...將會變得更加複雜。 GDI實際上並不支持所有在其API中廣泛使用的alpha通道。 AlphaBlend之外,其實它只保留頻道。它實際上無效的將COLOREF的高位設置爲alpha值,因爲高位字節實際上用於標誌以指示COLOREF是否(而不是RGB值)調色板條目。

所以,很遺憾,你的唯一真正的前進方式是:

  1. 創建一個32位的DIBSection。 (CreateDIBSection)。這給你一個保證能夠保存alpha信息的HBITMAP。如果通過其他位圖創建函數之一創建位圖,則它將位於設備colordepth,該位置可能不是32bpp。
  2. DrawText到DIBSection上。
  3. 當您創建的DIBSection你有一個指向實際內存。此時您需要查看內存並設置alpha值。我不認爲DrawText本身會對alpha通道本身做任何事情。林思位圖的每個DWORD的RGB分量的簡單的檢查 - 如果theyre於地面的顏色,改寫用50%(或其他)的DWORD阿爾法在α字節,如果theyre背景顏色,以100%的改寫alpha字節中的alpha。 *
  4. AlphaBlend位圖到最終目的地。 AlphaBlend要求源中的alpha通道被預倍增。

* 這可能足以簡單地做Draw​​Text的前50%的α-memset的的的DIBSection,並確保BKColor是黑色的。我不知道DrawText可能會對alpha通道做什麼。需要進行一些實驗。

+0

感謝您的回覆。我已經使用了這種方法。使用這個文本被繪製到矩形tranparently.But我想申請透明(alpha)的文本繪製這是不可能使用SetTextColor方法。 由於SetTextColor忽略了Color的Alpha值,我已經通過了一些應用程序使用掩碼位圖來應用透明度,但是我沒有得到想要的結果。我不想將透明度應用於位圖,我想將透明度應用於繪製到位圖上的文本。 任何幫助表示讚賞 – VideoDev 2009-08-28 05:21:38

+0

這個想法是,繪製到一個黑色的位圖,而不是一個信息位圖上的位圖。在對文本進行blitting之後,您可以掃描位圖中的非黑色像素,並根據是否部分文本調整每個像素的Alpha通道。 – 2009-09-22 07:31:32

0

Hmmmm - 試圖做同樣在這裏 - 想 - 我看到,當你創建一個DIB部分蜉指定「口罩」這是一個R,G,B(和alpha)面具。

IF和那大的,如果它真的不會改變阿爾法chhannel,那麼你可以指定不同的面具兩個位圖頭。 ONe在適當的位置指定thr RGB,另一個使得它們都將其位分配給alpha通道。 (在這種情況下,將文本顏色設置爲白色),然後渲染兩遍,一個加載顏色值,另一個加載alpha值。

????反正只是沉思:)

0

雖然這個問題的目的是使文字半透明的,我有相反的問題。

DrawText的使文字在我的分層窗口(UpdateLayeredWindow)半透明......我不希望它是。

看看這個其他question ...因爲在其他問題,我發佈一些代碼,你可以很容易地修改...幾乎正是克里斯貝克在他的回答中所暗示的。

7

簡便解決方案:)

有這個問題,我試圖改變α值和預乘,但有另一個問題 - 在沒有正確(難看邊緣)所示抗鋸齒和ClearType字體。所以我做了什麼......

  1. 撰寫的場景(位圖,圖形等)
  2. 的BitBlt需要從矩形這個場景(與您的文本矩形,從那裏你希望你的文字的地方)到存儲器DC,在0,0目標座標處選擇兼容位圖
  3. 將文本繪製到內存DC中的矩形。
  4. 現在AlphaBlend該BLENDFUNCTION中沒有AC_SRC_ALPHA的矩形以及從該內存DC中的所需SourceConstantAlpha返回到場景DC。

我覺得你得到它:)

0

特定情況的限制答案:

如果你有一個alpha通道的圖形,你想在本地不透明背景繪製不透明文本,首先使用CreateDIBPatternBrushPt創建32位畫筆,準備32位位圖。然後掃描反轉Alpha通道的位圖位,按照通常的方式繪製文本(包括SetBkModeTRANSPARENT),然後再次反轉位圖中的alpha。如果反轉筆刷的Alpha,則可以跳過第一個反轉。