C # : 시스템 색상을 기반으로 더 밝은 / 어두운 색상 만들기
복제
색상의 밝기는 어떻게 조정합니까?
주어진 색상의 더 어둡거나 밝은 색상 변형을 어떻게 결정합니까?
프로그래밍 방식으로 색상 밝게
내가 가지고 가지고
var c = Color.Red;
이제 Color
그 색상보다 더 밝거나 더 어두운 새 것을 만들고 싶습니다 . 너무 번거롭지 않게 어떻게 할 수 있습니까?
ControlPaint .Light .Dark .DarkDark 등
Color lightRed = ControlPaint.Light( Color.Red );
나는 최근 에 이것에 대해 블로그에 올렸다 . 주요 아이디어는 각 색상 구성 요소에 주어진 보정 계수를 적용하는 것입니다. 다음 정적 메서드는 지정된 보정 계수를 사용하여 지정된 색상의 밝기를 수정하고 해당 색상의 더 어둡거나 밝은 변형을 생성합니다.
/// <summary>
/// Creates color with corrected brightness.
/// </summary>
/// <param name="color">Color to correct.</param>
/// <param name="correctionFactor">The brightness correction factor. Must be between -1 and 1.
/// Negative values produce darker colors.</param>
/// <returns>
/// Corrected <see cref="Color"/> structure.
/// </returns>
public static Color ChangeColorBrightness(Color color, float correctionFactor)
{
float red = (float)color.R;
float green = (float)color.G;
float blue = (float)color.B;
if (correctionFactor < 0)
{
correctionFactor = 1 + correctionFactor;
red *= correctionFactor;
green *= correctionFactor;
blue *= correctionFactor;
}
else
{
red = (255 - red) * correctionFactor + red;
green = (255 - green) * correctionFactor + green;
blue = (255 - blue) * correctionFactor + blue;
}
return Color.FromArgb(color.A, (int)red, (int)green, (int)blue);
}
Lerp
함수를 사용 하여이 작업을 수행 할 수도 있습니다. XNA는 하나가 직접 작성하는 것이 좋습니다.
C # 구현에 대한 질문에 대한 내 대답을 참조하십시오 .
이 기능을 사용하면 다음을 수행 할 수 있습니다.
// make red 50% lighter:
Color.Red.Lerp( Color.White, 0.5 );
// make red 75% darker:
Color.Red.Lerp( Color.Black, 0.75 );
// make white 10% bluer:
Color.White.Lerp( Color.Blue, 0.1 );
많이 사용하는 방법의 대부분은 색상을 조정하여 결과가 좋지 않습니다. 가장 좋은 대답은 Rich Newman의 HSLColor 클래스 를 사용 하고 광도를 조정하는 것입니다.
public Color Darken(Color color, double darkenAmount) {
HSLColor hslColor = new HSLColor(color);
hslColor.Luminosity *= darkenAmount; // 0 to 1
return hslColor;
}
다음은 주어진 색상을 밝게 / 어둡게하기 위해 사용하는 자바 펼쳐보기입니다. 동등한 C # 함수의 기반으로 사용할 수 있습니다.
각 RGB 구성 요소의 순백색에서 거리를 계산 한 다음 요소 로이 거리를 조정합니다. 새 거리는 새 색상을 계산하는 데 사용됩니다. 0과 1 사이의 계수는 어두워지고 1보다 높은 계수는 밝아집니다
function Darken( hexColor, factor )
{
if ( factor < 0 ) factor = 0;
var c = hexColor;
if ( c.substr(0,1) == "#" )
{
c = c.substring(1);
}
if ( c.length == 3 || c.length == 6 )
{
var i = c.length / 3;
var f; // the relative distance from white
var r = parseInt( c.substr(0, i ), 16 );
f = ( factor * r / (256-r) );
r = Math.floor((256 * f) / (f+1));
r = r.toString(16);
if ( r.length == 1 ) r = "0" + r;
var g = parseInt( c.substr(i, i), 16);
f = ( factor * g / (256-g) );
g = Math.floor((256 * f) / (f+1));
g = g.toString(16);
if ( g.length == 1 ) g = "0" + g;
var b = parseInt( c.substr( 2*i, i),16 );
f = ( factor * b / (256-b) );
b = Math.floor((256 * f) / (f+1));
b = b.toString(16);
if ( b.length == 1 ) b = "0" + b;
c = r+g+b;
}
return "#" + c;
}
@Pavel의 대답 의 핵심 방법 을 사용하여 보증 인 (적어도 나를 위해)을 위해 다음 두 가지 작은 확장 방법을 준비했습니다.
public static Color LightenBy(this Color color, int percent)
{
return ChangeColorBrightness(color, percent/100.0);
}
public static Color DarkenBy(this Color color, int percent)
{
return ChangeColorBrightness(color, -1 * percent / 100.0);
}
RGB 백분율을 사용하여 원하는대로 더 밝게 또는 더 어둡게 만들 수도 있습니다. 다음은 색상을 실제보다 x % 더 어둡게 만드는 방법에 대한 예입니다.
//_correctionfactory in percentage, e.g 50 = make it darker 50%
private Color DarkerColor(Color color, float correctionfactory = 50f)
{
const float hundredpercent = 100f;
return Color.FromArgb((int)(((float)color.R / hundredpercent) * correctionfactory),
(int)(((float)color.G / hundredpercent) * correctionfactory), (int)(((float)color.B / hundredpercent) * correctionfactory));
}
한 가지 더 우리는 프로세스를 더 가볍게 사용할 수 있습니다. 단지 255-RGB의 결과를 얻은 다음 예제와 같이 백분율을 곱합니다.
private Color LighterColor(Color color, float correctionfactory = 50f)
{
correctionfactory = correctionfactory / 100f;
const float rgb255 = 255f;
return Color.FromArgb((int)((float)color.R + ((rgb255 - (float)color.R) * correctionfactory)), (int)((float)color.G + ((rgb255 - (float)color.G) * correctionfactory)), (int)((float)color.B + ((rgb255 - (float)color.B) * correctionfactory))
);
}
도움이되기를 바랍니다.
R / G / B 방향의 모든 조합에서 음영을 얻기 위해 RGB 구성 요소도 수정하도록 Pavel Vladov 함수를 변경했습니다.
Public Function ChangeColorShades(color As Color, correctionFactor As Single, bR As Boolean, bG As Boolean, bB As Boolean) As Color
Dim red As Single = CSng(color.R)
Dim green As Single = CSng(color.G)
Dim blue As Single = CSng(color.B)
If (correctionFactor < 0) Then
correctionFactor = 1 + correctionFactor
If bR Then
red *= correctionFactor
End If
If bG Then
green *= correctionFactor
End If
If bB Then
blue *= correctionFactor
End If
Else
If bR Then
red = (255 - red) * correctionFactor + red
End If
If bG Then
green = (255 - green) * correctionFactor + green
End If
If bB Then
blue = (255 - blue) * correctionFactor + blue
End If
End If
Return color.FromArgb(color.A, CInt(red), CInt(green), CInt(blue))
End Function
HSI 변환기 라이브러리 사용 (Google 검색). 그런 다음 I 채널을 더 밝게 / 어둡게 조정합니다.
ControlPaint 클래스를 살펴보십시오.
이 colorglower.com 을 수행하는 사이트를 만들었습니다 . 데모를 보려면 확인하십시오.
내가 사용한 자바 스크립트 코드는 다음과 같습니다.
function lighten(color) {
// convert to decimal and change luminosity
var luminosity = 0.01
var computedColors = new Array();
var newColor = "#",
c, i, n, black = 0,
white = 255;
for (n = 0; n < 10; n++) {
for (i = 0; i < 3; i++) {
c = parseInt(color.substr(i * 2, 2), 16);
c = Math.round(Math.min(Math.max(black, c + (luminosity * white)), white)).toString(16);
newColor += ("00" + c).substr(c.length);
}
computedColors[n] = newColor;
var arrayUnique = checkIfArrayIsUnique(computedColors);
if (arrayUnique == false) {
computedColors.pop();
break;
}
computedColors[n] = newColor;
newColor = "#";
luminosity += calcPercentage();
}
return computedColors;
}
이 코드는 16 진수 색상을 수신 한 다음 가장 밝은 색상 버전 10 개를 출력하고 배열에 넣습니다. 명도를 원하는대로 변경하여 음영 비율을 조정할 수 있습니다. 색상을 어둡게하려면 변경하면됩니다.
luminosity -= calcPercentage();
참조 URL : https://stackoverflow.com/questions/801406/c-create-a-lighter-darker-color-based-on-a-system-color
'ProgramingTip' 카테고리의 다른 글
rxjs 플랫 맵 누락 (0) | 2020.12.26 |
---|---|
이미지를 사용하기 위해 위해 UITableView의 배경 (tableview 스타일은 "그룹화")을 사용하는 방법? (0) | 2020.12.26 |
Android에서 EditText 서식을 지정하는 전화 번호 (0) | 2020.12.26 |
Android Studio- 모듈 없음 (0) | 2020.12.26 |
Node.js Port 3000이 이미 사용 중이지만 실제로는 말입니까? (0) | 2020.12.26 |