2012-05-22 2 views
0

나는 Bitmap을 가져 와서 주어진 색상을 다른 색상으로 대체하려는 상황이 있습니다. 내 원래의 계획은 Dictionary<Color, Color>을 전달한 다음 현재 픽셀이 사전 /지도에 있는지 확인하고 필요한 경우 교체합니다.알파 구성 요소를 무시하는 색상 비교

그러나 원본 이미지에 알파가 있으면 그 알파를 유지하고 싶습니다. 알파 컴포넌트를 무시하고 사전에 색상이 있는지 확인하는 가장 좋은 방법은 수수께끼입니다.

내가 지금까지 함께 왔어요 방법

은 새로운 RGBOnlyColor 클래스 또는를 만드는 것입니다 유사한 사용하는 대신 내 사전에 Color과 그것을보기 전에 나는이에 GetPixel에서 얻을 색상을 변환합니다. 이것은 상당히 잔인한 것 같습니다. 그래서 내가 더 간단하게하기 위해 놓친 것이 있다면 궁금합니다. ...

또 다른 옵션은 설정하고 검색 할 때 사전의 간단한 확장이 될 ColorMap 클래스를 만드는 것입니다. 알파를 알려진 값으로 설정하여 관련성이 없음을 확인합니다.

아무도 내가 할 수있는 최선의 방법은 무엇입니까? 요약하자면 알파 부분은 그대로두고 이미지의 색상을 바꾸고 싶지만 보이는 것보다 더 어렵습니다 ... :)

답변

2

직접적인 접근 방식은 제로 아웃하는 것 사전에서 그것을 검색하기 전에 각 색상의 알파 채널을 선택한 다음 매핑 된 색상이 해결 된 후 정확한 알파 값을 주입합니다.

예 :

컬러가 사전 조회되기 전에 알파가 0가되므로
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

D' oh! 물론 그것만큼이나 간단합니다. 사전에 대해 테스트하기 전에 이미지에서 얻은 색상을 수정하는 일조차 내게 발생하지 않았습니다. :) – Chris

1

알파를 제외하고 색상을 비교하려면 아무 것도 필요하지 않습니다. 보기보다 :

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

이 사전 기반 접근 방식을 구현하려면 255 Color.FromArgb(r, g, b)를 사용하는 알파 값이 색상으로 사전을 채울 수 있습니다. 아마도 확장 방법을 사용

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);