2010-02-11 5 views
31

rgb 구성 요소의 평균값을 계산 한 다음 검정색 또는 흰색 중 어느 것을 사용할지 결정하는 것과 비슷합니까?배경에 따라 전경색을 검정색 또는 흰색으로 만듭니다.

첫 번째 단계에서 RGB를 HSV로 변환해야합니까? 왜냐하면 RGB가 항상 사람의 눈으로 보는 것이 아니기 때문입니까?

난 그냥 RGB 값을 추가하고 반 진행이 있다면 계산할 수 당신이 #FFFFFF 색상 형식을 가지고 말한다면 당신은, 색상에 따라 간단한 계산을 할 수있는 C#을

+2

이 질문은 당신을 도울 답변을 포함하고 있습니다 : http://stackoverflow.com/questions/946544/good-text-foreground-color-for-a-given-background-color/946570 –

+0

관련 (그러나 스스로 속아) http://stackoverflow.com/questions/3116260/given-a-background-color-how-to-get-a-foreground-color-that-make-it-readable-on http://stackoverflow.com/ 질문/3942878/how-to-determined-font-color-in-white-or-black-by-background-color – JYelton

답변

3

어떨까요?

private static Color GetReadableForeColor(Color c) 
{ 
    return (((c.R + c.B + c.G)/3) > 128) ? Color.Black : Color.White; 
} 
+1

다음 값을 사용하여 이것을 시도하십시오 : 128, 255, 0. 검정색 배경에 읽기가 쉬운 밝은 녹색입니다. 그러나 평균값은 127이며, 메소드는 흰색을 반환합니다. – JYelton

0

을 사용하고 있습니다 . 색은 아래의

var colorCode = ((R + B + G) < 255*3) ? "#FFFFFF" : "#000000"; 

경우는 ... 흰색 배경을 사용하여 어두운 같습니다

그 경우 최대 255 그래서 그냥 그 임계 값 아래에 있는지 확인 당 (F는 = 256 F를 X) . 그것이 위의 경우 가볍고 ... 검정색 배경을 사용하십시오. 그것은 완벽하지는 않지만 시작하기위한 아이디어입니다.

+0

나는 원래이 프로젝트와 비슷한 것을 시도해 보았고 어떤 경우에는 흰색/검은 색 레이블은 배경색에 비해 눈에 띄지 않았습니다. – JYelton

59

너무 오래 전 프로젝트를 위해이 기능이 필요했습니다.

private int PerceivedBrightness(Color c) 
{ 
    return (int)Math.Sqrt(
    c.R * c.R * .241 + 
    c.G * c.G * .691 + 
    c.B * c.B * .068); 
} 

I 지각 색과 색 변환 처리 화학식 Nbd Tech의 웹에서 볼이 수식. 이 사이트는 많은 도움이되는 정보를 제공합니다.

여기 선택하려면이를 사용하는 방법은 검은 색 또는 흰색 :

var foreColor = (PerceivedBrightness(backColor) > 130 ? Color.Black : Color.White); 

당신은 컷오프 130 이외의 값을 사용할 수 있습니다; 그것은 선호된다. his site에서 다렐 렉스 핀리에 따르면 :


업데이트

값은 실제로 포토샵 0.241, 0.691, 그리고 0.068을했다 재생하여 함께했다,하지만 난이 그 이후에 .299, .587 및 .114 값이보다 정확하다는 통보를 받았습니다.

이 사양은 ITU-R Recommendation BT.601 (또는 간단히 녹음기 601)을 따릅니다. 위에서 언급 한 사이트 인 Nbd Tech은 아직 반영되지 않았습니다. 임계 환경에

private int PerceivedBrightness(Color c) 
{ 
    return (int)Math.Sqrt(
    c.R * c.R * .299 + 
    c.G * c.G * .587 + 
    c.B * c.B * .114); 
} 

주 : 근처인지 휘도

색이 기준

여기 (코멘트 용 DTI-매트 덕분) 업데이트 방법 인 중간 (예 : 120-140)은보다 주관적입니다. 예를 들어, 139로 평가되는 빨간색 (FF0000)이 검정색 또는 흰색 오버레이로 선명 해지는 지 여부는 논란의 여지가 있습니다. 내가 제대로 이해 해요 경우

White and Black on Red

+0

이것은 기본적으로 lumliers에 대한 공식으로, 이상치에 더 많은 가중치를 부여하는 값을 제곱합니다. 결과는 0-255 눈금입니다. http://en.wikipedia.org/wiki/Luma_%28video%29 –

+2

** 참고 : **이 값의 출처는 다음과 같이 업데이트되었습니다. http://alienryderflex.com/hsp.html 표시됩니다. 'R : .299''G : .587''B : .114' –

+0

@DTI 팁 주셔서 감사합니다. 답변을 업데이트했습니다. – JYelton

-1

는 한 가지 방법은, 바탕 화면 배경 무늬 이미지를 잡아 그것이 무슨 색깔 약간의 영지에 확인하고 그 기반으로 응용 프로그램의 색상을 변경할 수 있습니다.

(즉에 구글과 안타 많이) 현재 바탕 화면의 보류보기에 대한 기사 on geekpedia있다,하지만 기본 전제는 현재의 벽지의 레지스트리 값을 잡아하는 것입니다

RegistryKey rkWallPaper = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", false); 
string WallpaperPath = rkWallPaper.GetValue("WallPaper").ToString(); 

당신 그런 다음 해당 경로를 사용하여 이미지를 열 수 있습니다. 그런 다음 RGB의 치수 및 개별 픽셀 색상과 같은 많은 특성을 확보 할 수 있습니다.

"더 흰색"또는 "더 검정"인지 여부를 결정하려면 많은 옵션이 필요합니다.

하나의 아이디어는 RGB로 각 픽셀 색을 얻고, 그레이 스케일 값을 얻기 위해 값을 평균 한 다음 이미지 전체의 각 픽셀의 그레이 스케일 값을 평균하는 것입니다. 128> 128이 나온다면 이 "흰색"으로 장식 될 수 있습니다. < 128이면 "검은 색"입니다. 기본적으로 중간 회색으로 나누는 선의 어느면에서 이미지 픽셀 강도가 평균화되는지를 결정합니다.

// Psudo code - can't check the C# spec atm. 
foreach(Pixel p in image) 
{ 
    // get average of colour components. 
    double greyScale = (p.Red + p.Green + p.Blue)/3; 
    totalIntensity += greyScale; 
} 

double averageImageIntensity = totalIntensity/image.NumPixels; 

if(totalIntensity > 128) // image could be considered to be "white" 
else // image could be considered "black". 

문제 : 느린 절차 일 수 있으므로 시간을 절약하기 위해 일부 픽셀 (예 : 10 번째 등) 만 샘플링 할 수 있습니다. 더 일반적으로 말하자면, 전혀 해킹되지 않는 것처럼 보입니다. 런타임에 사용자 파일을 당겨서 혼란스럽게하는 것은 거의 깨끗하지 않으며 잠재적 인 보안 및 안정성 문제를 제공합니다. 이미지가 더럽거나 손상되면 어떻게 될까요?

개인적으로 저는 사용자에게 단순히 색상/테마/스킨 자체의 선택권을 부여하거나 더 나은 방법으로 사용자 지정하도록 제안하는 것이 좋습니다.

+0

전체 앱 색상을 변경하고 싶지 않습니다. 항목이 bg 색상이고 각 항목의 텍스트를 읽을 수 있어야하는 listview를 사용 중입니다 ... – Kai

3

구조체 Color 구조체는 기본적으로 HSB 로의 변환을 지원합니다.

if (Color.GetBrightness() > 0.5f) { 
    // win 
} 

채도가 명백한 '밝기'에 기여한다는 점을 고려하여 채도의 구성 요소도 추가 할 수 있습니다.

관련 문제