2009-10-01 92 views
3

使用Graphics::DrawImage可以繪製圖像的transperancy mask(即用固定顏色繪製所有可見像素)嗎?我不是在尋找手動逐像素掃描圖像,並創建一個單獨的蒙版圖像,我想知道是否有可能從原始圖像直接繪製一個。GDI +,使用DrawImage繪製源圖像的transperancy mask

我的猜測是,如果可能的話,應該對ImageAttributes進行某些操作。

蒙版的顏色是任意的,應該是準確的,並且如果透明度可能存在閾值,它將是一個加號。

回答

0

您的意思是說,您想要將位圖中的每個現有顏色轉換爲一種統一的顏色,同時完全遵守圖像中存在的alpha /透明度信息?

如果是這樣,只需使用以下嘉洛斯:

imageAttributes.SetColorMatrix(new ColorMatrix(new float[][] { 
    new float[] {0, 0, 0, 0, 0}, 
    new float[] {0, 0, 0, 0, 0}, 
    new float[] {0, 0, 0, 0, 0}, 
    new float[] {0, 0, 0, 1, 0}, 
    new float[] {r, g, b, 0, 1}})); 

其中R,G,B爲0和1之間,就像這樣:

float r = DesiredColor.R/255f; 
float g = DesiredColor.G/255f; 
float B = DesiredColor.B/255f; 

我不明白你的意思通過「這將是一個加,如果可以有一個透明度閾值」,雖然...所以也許這不是你要找的答案?

+0

這不是這麼回事。轉換隻需要在可見/不可見(而不是維護它)方面遵守源阿爾法。因此,閾值指示可見度限制(即α> = 20?可見:不可見)。所有可見的像素都應該使用統一的顏色來繪製,而所有看不見的像素都不應該被繪製。統一的顏色應該是ARGB(而不僅僅是RGB),並且應該是準確的(我不確定漂浮物可以保持1/255的多好) – sold 2009-10-04 09:14:26

+0

啊,我以爲我錯過了一些東西!那麼,我肯定會通過逐像素掃描來創建一個新的圖像。至少它會比ImageAttribute解決方案快得多。 – 2009-10-04 09:30:03

1

我必須繪製每像素alpha蒙版的圖像,發現最好的方法是繪製基本的RGB圖像,然後在頂部繪製alpha蒙版的不透明部分。您需要將每個Alpha級別映射到Alpha級別+顏色以獲取圖像以兌現Alpha蒙版中的每個細節。我已經得到了代碼具有阿爾法遮掩作爲一個單獨的8位圖像,但平局的代碼如下所示:

g.DrawImage(&picture, r.left, r.top, r.Width(), r.Height()); // base image  

if (AlphaBuf != NULL) // do we have and alpha mask? 
{ 
Gdiplus::Bitmap mask(Width, Height, Width(), PixelFormat8bppIndexed, AlphaBuf); 
picture.GetPalette(palette, picture.GetPaletteSize()); 
    // invert - only shows the transparent 
palette->Entries[0] = DLIMAKEARGB(255, 0, 0, 200); // 0 = fully transparent 
palette->Entries[255] = DLIMAKEARGB(0, 0, 0, 0); // 255 = fully opaque 

mask.SetPalette(palette); 
g.DrawImage(&mask, r.left, r.top, r.Width(), r.Height()); // draw the mask 
} 

我的阿爾法面具是唯一的全透明或不透明的全面,但我認爲,設置其他α值在調色板將讓你跟隨更加畢業的面具。

palette->Entries[1] = DLIMAKEARGB(254, 0, 0, 200); 
palette->Entries[2] = DLIMAKEARGB(253, 0, 0, 200); 
etc.. 

希望這有助於(或至少是有道理的:-P)