2012-05-22 112 views
0

我有一種情況,我想採取Bitmap並通過它替換給定顏色的不同顏色。我原來的計劃是通過Dictionary<Color, Color>,然後遍歷所有像素,檢查當前顏色是否在字典/地圖中,然後在需要時進行替換。比較忽略alpha分量的顏色

但是,如果原始圖像有任何alpha我想保留該alpha。我很迷惑最好的方法來檢查字典中的顏色是否忽略了alpha分量。

的方式,我拿出這麼遠只是爲了創建一個新的RGBOnlyColor類或相似的,用它來代替Color在我的字典裏,看着它轉換前的顏色,我從GetPixel這個搞定。這似乎是相當矯枉過正,所以我想知道是否有任何我錯過了,使它更簡單...

另一種選擇是創建一個ColorMap類,這將是一個簡單的擴展字典,當設置和檢索只是迫使阿爾法爲已知值,以確保它是無關緊要......

所以任何人可以幫助我做什麼最好的方法是什麼?總之我想換顏色的圖像在離開阿爾法部分完好,但它是難度比它看起來應該是... :)

回答

2

一種直接的方法是歸零在字典中查找每種顏色的alpha通道,然後在映射顏色解析後注入正確的alpha值。

實施例:

Color colorFromBitmap; // assume already have this 
var colorToLookup = Color.FromArgb(0, colorFromBitmap); 
var mappedColor = dictionary[colorToLookup]; 
var finalResult = Color.FromArgb(colorFromBitmap.A, mappedColor); 

由於阿爾法設置爲0顏色在詞典查找之前,詞典內的顏色應該都具有0阿爾法爲好。

+0

D'oh!當然這很簡單。在對照字典進行測試之前,我甚至沒有想過修改從圖像中獲得的顏色。 :) – Chris

1

要比較的顏色,但不包括阿爾法的比較,你不需要任何超過這個:

bool RGBequal(Color c1, Color c2) 
{ 
    return c1.R==c2.R && c1.G==c2.G && c1.B==c2.B; 
} 

要實現你的字典爲基礎的方法,你可以填充有使用Color.FromArgb(r, g, b) 255的阿爾法值的顏色字典。也許使用擴展方法:

Color Opaque(this Color color) 
{ 
    return Color.FromArgb(color.R, color.G, color.B); 
} 

創建一個新的顏色,從一種顏色與RGB從另一個顏色結合α通道是很簡單的:

Color.FromArgb(color1.A, color2.R, color2.G, color2.B);