SORU
26 EYLÜL 2008, Cuma


Program aracılığıyla bir renginin solması

Motivasyon

Programlama yoluyla daha hafif bir sürüm için bir renk güzel bir degrade oluşturmak, böylece rasgele bir renk alıp birkaç ton hafifletmek için bir yol bulmak istiyorum. Degrade bir UI arka plan olarak kullanılacaktır.

Olasılık 1

Belli ki sadece RGB değerlerini bölünmüş ve ayrı ayrı belirli bir miktar bunları artıracağız. Gerçekten istediğim bu mu?

Olasılık 2

Benim ikinci düşünce dönüştürmek RGB HSV/HSB/HSL (Ton, Doygunluk, Değer/Parlaklık/Açıklık), artış parlaklığı biraz azaltmak doygunluğu biraz, ve sonra geri dönüştürmek için RGB. Bu genel olarak istenen etki yapar?

CEVAP
26 EYLÜL 2008, Cuma


Wedge said, her şey daha güzel yapmak için çarpmak istiyorsun, ama tek renk (yani hit 255 ya da daha büyük) doymuş hale gelinceye kadar çalışır. Bu noktada, sadece 255, ama hafif hafif olsun renk değiştirme olacaksın değerleri kelepçe. Renk tutmak için, (orta-düşük)/oranı(en yüksek-en düşük) korumak istiyorum.

Burada Python iki işlev. Eğer üzerine giderlerse 255 ilk uygulayan sadece RGB değerlerini kelepçeler olan naif bir yaklaşım. İkinci renk olduğu gibi korumak için aşırı değerleri yeniden dağıtır.

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)

Bir Gradyan RGB değeri (224,128,0) ile başlayan ve 1.0, 1.1, 1.2, ile çarpılarak vb yarattım. 2.0. Üst yarısı clamp_rgb ve alt yarısını kullanarak redistribute_rgb sonucudur sonucudur. Kolay taşıyor dağıtarak çok daha iyi bir sonuç, RGB renk alanı terk etmek zorunda kalmadan verdiğini görmek bence.

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

Karşılaştırma için, burada Python colorsys modülü tarafından uygulanan HLS, ve HSV renk alanlarda aynı degrade. L yalnızca bileşen değiştirildi ve kenetleme elde edilen RGB değerlerini yapıldı. Sonuçlar benzer, ama her piksel için renk alanı dönüşüm gerektirir.

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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ecf150king

    ecf150king

    20 Ocak 2006
  • Microsoft Research

    Microsoft Re

    24 EKİM 2008
  • psidot

    psidot

    2 Kasım 2006