문제

동기 부여

고 싶은 방법을 찾을 수 있는 임의의 색깔을 가볍게 그것은 몇 가지 그늘,할 수 있도록 프로그래밍 방식으로 만들기 좋은데에서 하나의 색깔을 가벼운 버전입니다.그라데이션을 사용되는 것으로 배경에 UI.

가능성 1

분명히 그 분의 RGB 값을 증가들에 의해 개별적으로 특정 금액입니다.이제 내가 원하는 무엇인가?

가능성 2

내 생각을 변환 RGB HSV/HSB/HSL(색조,채도,가치/밝기/가벼움),밝기를 증가시킨 조금 감소,채도,그리고 그런 다음 다시 변환하 RGB.이것이 원하는 효과가 일반적으?

도움이 되었습니까?

해결책

나는 두 번째 옵션입니다.일반적으로 말하자면 RGB 공간은 정말 좋은 일에 대한 컬러 조작(을 만들기 전환에서 하나의 컬러는 다른,밝게/어둡게 하는 색상,etc.).아래 두 가지 사이트를 발견했으로 빠른 검색에서 변환/RGB 에서 HSL:

다른 팁

웨지 말, 할을 곱게 만들 것을 밝지만,그만 작동까지 중 하나는 색상이 포화(즉히 255 또는 그 이상).그 시점에서,당신은 단지 클램프 값이 255,하지만 당신은 미묘하게 변화하는 색상으로 당신을 얻을 더 가볍습니다.을 유지하는 색상,당신을 유지하려면의 비율(중 최저)/(최저).

여기에는 두 가지 기능에 있습니다.첫 번째를 구현하는 순진한 접근은 단지 클램프 RGB 값이 255 는 경우 그들이 끝났습니다.두 번째는 재배포하는 초과 값을 유지하는 색상 그대로 유지됩니다.

def clamp_rgb(r, g, b):
    return min(255, int(r)), min(255, int(g)), min(255, int(b))

def redistribute_rgb(r, g, b):
    threshold = 255.999
    m = max(r, g, b)
    if m <= threshold:
        return int(r), int(g), int(b)
    total = r + g + b
    if total >= 3 * threshold:
        return int(threshold), int(threshold), int(threshold)
    x = (3 * threshold - total) / (3 * m - total)
    gray = threshold - x * m
    return int(gray + x * r), int(gray + x * g), int(gray + x * b)

을 만들었는데 그라데이션을 시작으로 RGB 값(224,128,0)곱하여 1.0,1.1,1.2,etc.최대 2.0.상반을 사용하여 결과 clamp_rgb 그리고 하단은 그 결과로 redistribute_rgb.나는 쉽게 생각하는 재배포의 오버플로 제공하는 훨씬 더 나은 결과를 떠나지 않고 RGB 색상 공간입니다.

Lightness gradient with clamping (top) and redistribution (bottom)

비교를 위해,여기에는 동일한 그라데이션에 HLS 및 HSV 색상 공간,구현하는 파이썬's colorsys 모듈입니다.만 L 구성 요소를 수정하고 죄에서 수행 되었고 결과 RGB 값입니다.결과는 비슷하지만,필요한 색상의 공간에 대한 변환 모든 픽셀.

Lightness gradient with HLS (top) and HSV (bottom)

C#

public static Color Lighten(Color inColor, double inAmount)
{
  return Color.FromArgb(
    inColor.A,
    (int) Math.Min(255, inColor.R + 255 * inAmount),
    (int) Math.Min(255, inColor.G + 255 * inAmount),
    (int) Math.Min(255, inColor.B + 255 * inAmount) );
}

내가 사용했던 이 모든 장소입니다.

ControlPaint 클래스에서는 시스템입니다.Windows.Forms 네임스페이스는 정적 방법을 빛과 어둠:

public static Color Dark(Color baseColor, float percOfDarkDark);

이러한 방법을 사용하여 개인의 구현 HLSColor.이는 구조체었선민주주의인민공화 시스템입니다.Drawing.

또는,당신은 당신이 사용할 수 있습 GetHue,GetSaturation,GetBrightness 에 컬러 구조체를 얻을 HSB 구성 요소입니다.불행하게도 찾지 못한 역방향 변환입니다.

로 변환하 RGB 및 선형 보간 사이에 원본 컬러와 대상 색상(자주색).그래서,당신은 16 그늘 사이의 두 개의 색상,당신은:


for(i = 0; i < 16; i++)
{
  colors[i].R = start.R + (i * (end.R - start.R)) / 15;
  colors[i].G = start.G + (i * (end.G - start.G)) / 15;
  colors[i].B = start.B + (i * (end.B - start.B)) / 15;
}

을 얻기 위해서 밝거나 어두운 버전의 색상을 수정해야 합니다 그 밝기가 있습니다.이를 손쉽게 수행할 수 있습니다 심지어는 변환없이 당신의 색깔을 HSL 또는 HSB 색상입니다.예를 들어를 확인 색이 가볍고 사용할 수 있습니다 다음 코드:

float correctionFactor = 0.5f;
float red = (255 - color.R) * correctionFactor + color.R;
float green = (255 - color.G) * correctionFactor + color.G;
float blue = (255 - color.B) * correctionFactor + color.B;
Color lighterColor = Color.FromArgb(color.A, (int)red, (int)green, (int)blue);

더 많은 정보를 필요로 하는 경우, 읽기 전체에서 이야기 나 블로그.

매우 유사한 질문에 유용한 답변을 요청했다는 이전에:어떻게 확인할 수 있는 더 어둡거나 밝은 색상의 변형이 주어진 색깔이 있는가?

짧은 대답:곱 RGB 값에 의해 일정한 경우 그 필요가"충분히"좋은,번역 HSV 필요할 경우 정확성입니다.

나는 사용 앤드류의 대답을 표시의 대답을 (로 1/2013 지 않는 범위에 대한 입력 ff).

function calcLightness(l, r, g, b) {
    var tmp_r = r;
    var tmp_g = g;
    var tmp_b = b;

    tmp_r = (255 - r) * l + r;
    tmp_g = (255 - g) * l + g;
    tmp_b = (255 - b) * l + b;

    if (tmp_r > 255 || tmp_g > 255 || tmp_b > 255) 
        return { r: r, g: g, b: b };
    else 
        return { r:parseInt(tmp_r), g:parseInt(tmp_g), b:parseInt(tmp_b) }
}

enter image description here

로 변환하 HS(LVB),밝기를 증가시키고 그때로 돌아 RGB 방법 안정적으로 밝은 색상에 영향을 미치지 않으면서 색상과 채도 값을(즉,만 밝은 색상을 변경하지 않고 다른 어떤 방법으로 그것).

나는 이것 모두 방법으로 당신은 더 나은 결과를 얻을 함께 가능성 2.

어떤 간단한 알고리즘을 구축을 위해 가능성 1 것입니다 아마 잘 작동에 대해서만 제한된 범위의 시작을 채도.

당신이 보길 원하는 것이 포 1 는 경우(1)제한할 수 있습 색상 밝기를 가지고 사용하고,(2)당신이 계산을 수행하에 많은 렌더링을 수행합니다.

생성한 UI 필요가 없어 매우 많은 음영을 계산하도록 Poss2.

-Al.

을 생성하려는 경우 그라데이션을 페이드아웃,나는 것이 좋을 다음과 같은 최적화:을 하기 보다는 오히려 RGB->HSB->RGB 각색해야만 계산하는 대상 색상입니다.일단 당신이 알고 대상 RGB,당신은 단순히 계산하는 중간에 값을 RGB 공간 필요없이 앞뒤로 변환.여부를 당신이 계산하는 선형의 전환을 사용하여 어떤 종류의 곡선은 당신입니다.

방법 1:변환 RGB 을 HSL,조정 HSL,다시 변환하 RGB.

방법 2: 오류 보호 RGB 색상 값 http://en.wikipedia.org/wiki/Lerp_(컴퓨팅)

내 대답하여 이와 유사한 질문 C#의 구현 방법 2.

는 척 당신은 알파 혼합하는 화이트:

oneMinus = 1.0 - amount
r = amount + oneMinus * r
g = amount + oneMinus * g
b = amount + oneMinus * b

amount 는 0~1,0 으로 반환하는 원래의 색깔과 1 돌아 흰색이다.

할 수 있습 혼합으로 최상의 배경 색상이 있는 경우 조명을 표시하는 무언가가 장애인:

oneMinus = 1.0 - amount
r = amount * dest_r + oneMinus * r
g = amount * dest_g + oneMinus * g
b = amount * dest_b + oneMinus * b

(dest_r, dest_g, dest_b) 는 색상을 혼합하고 amount 는 0 에서 1,제로 돌아 (r, g, b) 1 돌아 (dest.r, dest.g, dest.b)

지 않았을 찾을 때까지 질문이 된 이후에는 관련 질문을 내는 원래 질문입니다.

그러나 사용하여 통찰력에서 이러한 위대한 답변이 있습니다.내가 함께 재현에 좋은 두 개의 라이너 기능을 위해 이:

프로그래밍 방식으로 가볍게 또는 어둡게 여러(또는 rgb 며,색상을 혼합)

해당 버전의 방법 1.그러나 이상과 채도 고려됩니다.다음과 같 Keith 말했다 그의 대답에 위;사용 오류 보호하는 적당 같은 문제를 해결할 수 있 표시 언급하지만,지 않고 재배포.결과 shadeColor2 해야에 훨씬 더 가까이 그것을 하고 있으로 올바른 방법으로 HSL,그러나 없이 오버헤드가 발생합니다.

조금 늦은 파티에,하지만 당신이 사용하는 경우 javascriptnodejs, 사용할 수 있습니다 tinycolor 라이브러리, 고,조작하는 컬러는 방법 당신이 원하는:

tinycolor("red").lighten().desaturate().toHexString() // "#f53d3d" 

내가 노력#1 번지만,#2 아주 좋습니다.스스로 일을 시도하고 당신이 만족하는 결과,같은 소리 그것은 당신을 데려 갈 것이 아마도 10 분 채찍질하는지 테스트합니다.

기술적으로,나는 생각하지 않거나 올바른다고 생각하지만,나는 당신이 원하는 변형의 옵션#2.문제가 되는 RGB990000 고"번개"그것은 정말 추가에 빨간색 채널(가치,밝기,가벼움)하 FF.후에는(빨간색),그것은 것을 복용 채도 모든 방법을 이동하는 고체 흰색이다.

변환을 얻을 수신,특히 때문에 당신이 갈 수 없어 직접 및 RGB 및 실험실이지만,나는 당신이 정말로 원하는 별도의 색차 및 luminence 값을 수정할 수 luminence 정말로 달성하기 위해 무엇을 원합니다.

을 찾을 수 있 변환 코드 사이의 색상 공간에서 색상-ruby 라이브러리 도구

블로그 게시물 는 작업을 수행하는 방법을 보여 줍니다 이에 Delphi.그것의 아주 간단하기 때문에 기능 ColorRGBToHSL 및 ColorHLSToRGB 는 표준 라이브러리입니다.

여기에는 예의 조명 RGB 색깔에서는 Python:

def lighten(hex, amount):
    """ Lighten an RGB color by an amount (between 0 and 1),

    e.g. lighten('#4290e5', .5) = #C1FFFF
    """
    hex = hex.replace('#','')
    red = min(255, int(hex[0:2], 16) + 255 * amount)
    green = min(255, int(hex[2:4], 16) + 255 * amount)
    blue = min(255, int(hex[4:6], 16) + 255 * amount)
    return "#%X%X%X" % (int(red), int(green), int(blue))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top