Rumah > pembangunan bahagian belakang > Tutorial Python > Teori Warna: Bermain dengan Warna Secara Pengaturcaraan

Teori Warna: Bermain dengan Warna Secara Pengaturcaraan

Patricia Arquette
Lepaskan: 2024-11-26 07:24:11
asal
791 orang telah melayarinya

Color Theory: Playing with Colors Programmatically

Apabila saya mula membina Colorify Rocks, tapak web palet warna saya, saya tidak tahu sejauh mana kedalaman lubang arnab manipulasi warna terprogram. Apa yang bermula sebagai projek mudah "biar saya bina pemilih warna" bertukar menjadi perjalanan yang menarik melalui teori warna, ruang warna matematik dan pertimbangan kebolehaksesan. Hari ini, saya ingin berkongsi perkara yang saya pelajari semasa membina alat ini, bersama beberapa kod Python yang mungkin membantu anda dalam pengembaraan warna anda sendiri.

Ia Hanya Warna, Betapa Kerasnya?

Oh, lalu saya. Betapa naifnya awak! Perjalanan saya bermula dengan matlamat mudah: membina tapak web di mana orang boleh menjana dan menyimpan palet warna. Mudah, kan? Hanya ambil kod hex dan... tunggu, apakah itu HSL? Dan mengapa kita memerlukan RGB? Dan apakah di dunia ini CMYK?

Nak tengok apa yang saya cakapkan? Lihat analisis warna kami untuk #3B49DF

Inilah sekeping kod pertama yang saya tulis untuk mengendalikan penukaran warna, yang kini membuatkan saya ketawa melihat kesederhanaannya:

class Color:
    def __init__(self, hex_code):
        self.hex = hex_code.lstrip('#')
        # Past me: "This is probably all I need!"
    def to_rgb(self):
        # My first "aha!" moment with color spaces
        r = int(self.hex[0:2], 16)
        g = int(self.hex[2:4], 16)
        b = int(self.hex[4:6], 16)
        return f"rgb({r},{g},{b})"
Salin selepas log masuk

Semuanya adalah Matematik

Kemudian tibalah saat saya menyedari bahawa warna pada asasnya hanyalah matematik dalam penyamaran. Menukar antara ruang warna bermakna menyelam ke dalam algoritma yang saya tidak pernah sentuh sejak sekolah menengah. Inilah kod yang berubah menjadi

def _rgb_to_hsl(self):
    # This was my "mind-blown" moment
    r, g, b = [x/255 for x in (self.rgb['r'], self.rgb['g'], self.rgb['b'])]
    cmax, cmin = max(r, g, b), min(r, g, b)
    delta = cmax - cmin
    # The math that made me question everything I knew about colors
    h = 0
    if delta != 0:
        if cmax == r:
            h = 60 * (((g - b) / delta) % 6)
        elif cmax == g:
            h = 60 * ((b - r) / delta + 2)
        else:
            h = 60 * ((r - g) / delta + 4)
    l = (cmax + cmin) / 2
    s = 0 if delta == 0 else delta / (1 - abs(2 * l - 1))
    return {
        'h': round(h),
        's': round(s * 100),
        'l': round(l * 100)
    }
Salin selepas log masuk

Warna Mempunyai Hubungan

Salah satu ciri paling menarik yang saya bina untuk Colorify Rocks ialah penjana harmoni warna. Ternyata warna mempunyai hubungan antara satu sama lain, sama seperti nota muzik! Begini cara saya melaksanakan harmoni warna:

def get_color_harmonies(self, color):
    """
    This is probably my favorite piece of code in the entire project.
    It's like playing with a color wheel, but in code!
    """
    h, s, l = color.hsl['h'], color.hsl['s'], color.hsl['l']
    return {
        'complementary': self._get_complementary(h, s, l),
        'analogous': self._get_analogous(h, s, l),
        'triadic': self._get_triadic(h, s, l),
        'split_complementary': self._get_split_complementary(h, s, l)
    }
def _get_analogous(self, h, s, l):
    # The magic numbers that make designers happy
    return [
        self._hsl_to_hex((h - 30) % 360, s, l),
        self._hsl_to_hex(h, s, l),
        self._hsl_to_hex((h + 30) % 360, s, l)
    ]
Salin selepas log masuk

Kebolehcapaian

Pembuka mata terbesar datang apabila pengguna yang buta warna menyerahkan maklum balas. Saya telah terlepas pandang sepenuhnya kebolehaksesan! Ini membawa saya untuk melaksanakan simulasi buta warna:

def simulate_color_blindness(self, color, type='protanopia'):
    """
    This feature wasn't in my original plan, but it became one of
    the most important parts of Colorify Rocks
    """
    matrices = {
        'protanopia': [
            [0.567, 0.433, 0],
            [0.558, 0.442, 0],
            [0, 0.242, 0.758]
        ],
        # Added more types after learning about different forms of color blindness
        'deuteranopia': [
            [0.625, 0.375, 0],
            [0.7, 0.3, 0],
            [0, 0.3, 0.7]
        ]
    }
    # Matrix multiplication that makes sure everyone can use our color palettes
    return self._apply_color_matrix(color, matrices[type])
Salin selepas log masuk

Apabila Colorify Rocks berkembang, pereka mula meminta lebih banyak ciri. Yang besar? Lorek dan tint warna. Ini membawa kepada beberapa percubaan yang menyeronokkan:

def get_color_variations(self, color, steps=10):
    """
    This started as a simple feature request and turned into
    one of our most-used tools
    """
    return {
        'shades': self._generate_shades(color, steps),
        'tints': self._generate_tints(color, steps),
        'tones': self._generate_tones(color, steps)
    }
Salin selepas log masuk

Atas ialah kandungan terperinci Teori Warna: Bermain dengan Warna Secara Pengaturcaraan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan