2012-10-12 49 views
1

我已經創建了32位DIB部分,填充一些非零值(FillMemory)並使用GDI函數對其進行繪製。 我已經看過DIB部分的內存,並且看到每個第4個字節(alpha通道)現在都有一個0。 幾年前,我曾解釋過這種行爲,但沒有找到答案(也不能記得GDI爲何如此行事)。 有人知道爲什麼它的GDI函數將alpha通道設置爲0?有沒有這種行爲的規範?GDI函數在繪製時將alpha通道設置爲0。爲什麼?

的想法是這樣的:

dib = CreateDIBSection(hdc..., &bytes); 
    FillMemory(bytes,...255); 
    memdc = CreateCompatibleDC(hdc); 
    SelectObject(memdc, bid); 
    MoveTo(memdc,...); 
    LineTo(memdc,...); 
    // look at every pixel in bytes 
    // if alpha == 255 then it is undrawn pixel 
    // and set alpha + premultiply colors otherwise 
    AlphaBlend(hdc, ... memdc,...); 

此代碼的工作。但是,它假設GDI函數將α設置爲0.我想確定它是「合法行爲」。

回答

3

這是因爲在最初設計Windows GDI之後,alpha混合已成爲繪圖功能的一部分。您必須使用AlphaBlend()等相對較新的功能(自Windows 2000 AFAIK以來,纔有此功能)。

本來GDI被設計成使得32位顏色值COLORREFRGB組成,它包含像0x00bbggrr那樣的顏色。所以就像你看到的......你認爲是alpha通道位不是。這些實際上被GDI設置爲零。透明度是通過使用蒙版而不是阿爾法混合來實現的。

GDI COLORREF的二進制形式是通過鏈接我給喜歡你的代碼中,如此行爲記錄是合法的(直到MS改變文檔萬一)。

+0

其實我使用DIB部分來獲得透明度。但AlphaBlend將所有繪製的對象視爲透明對象,因爲GDI函數將alpha通道設置爲0. – sibvic

+0

@sibvic是的,GDI將它們設置爲0,因爲在GDI文檔中,這些位爲0(它們不是alpha通道位)直到今天。 –

相關問題