Tujuan utama model warna RGB (Merah Hijau Biru) adalah untuk penginderaan, representasi dan tampilan gambar dalam sistem elektronik, seperti televisi dan komputer.
HSL (Hue Saturation Lightness) adalah model warna alternatif, yang dirancang pada tahun 1970-an oleh para peneliti grafis komputer untuk lebih menyelaraskan dengan cara penglihatan manusia memandang atribut-atribut pembuatan warna.
Berikut adalah artikel wiki untuk RGB dan HSL . Adalah umum untuk program grafis untuk melakukan perhitungan dalam HSL, dan kemudian dikonversi ke format yang disukai untuk sebagian besar layar: RGB.
Tugasnya adalah menulis fungsi / program yang menggunakan HSL sebagai input dan output RGB.
Anda dapat memilih representasi pilihan Anda untuk I / O, selama konsisten di antara mereka.
Misalnya, mereka dapat berupa array / tuple dengan 3 elemen atau objek dengan 3 properti bernama h
,, s
dan l
, tetapi saya akan menerima variasi pintar lainnya, seperti menerima hsl sebagai integer (kehilangan presisi) dan menghasilkan integer rgb.
Input dapat dianggap aman dalam rentang dan format, yang keduanya dapat Anda putuskan. Saya sangat menyarankan rentang 0-1 0-1 0-1
atau 0-360 0-100 0-100
untuk hsl, dan 0-1 0-1 0-1
atau 0-255 0-255 0-255
untuk rgb.
Setiap jawaban diperlukan untuk menentukan kedua hal di atas, dan berikan berbagai variasi dalam jawaban Anda jika Anda sangat bangga dengan mereka, bahkan jika mereka tidak memiliki karakter yang lebih sedikit daripada variasi lainnya. Letakkan yang terkecil di atas.
Kasus uji semu untuk 0-360 0-100 0-100
→0-255 0-255 0-255
h s l → r g b
0 0 0 → 0 0 0
90 56 17 → 43 68 19
202 19 39 → 81 104 118
72 55 26 → 88 103 30
Rumus untuk konversi dapat ditemukan di sini :
Ini sebagai cara yang bagus untuk memvisualisasikan konversi:
sumber
H
dari0-360
adalah[0,360)
, hal itu akan lebih baik ditulis sebagai0-359
?a-b
notasi itu salah dalam dirinya sendiri ketika berhadapan dengan nilai-nilai non-integer, tapi saya akan mengatakan itu ok untuk menjaga pertanyaan lebih mudah dibaca. Jika ada orang lain yang mengeluh, saya akan memikirkannya kembali, jadi terima kasih telah menunjukkannya[0,360)
saat itu :)Jawaban:
JavaScript (ES6),
989594 byteMengambil H dalam [0,360) dan S / L dalam [0,1) . Output R , G dan B sebagai array dari 3 float di [0,1) .
Uji kasus
Cuplikan ini mengubah hasilnya kembali menjadi [0,255] .
Tampilkan cuplikan kode
Bagaimana?
Kode inisialisasi
Kode utama
Permutasi dari (0, C, X)
Bagian yang sedikit rumit adalah untuk menghasilkan permutasi yang benar (0, C, X) sesuai dengan sudut komponen rona. Seperti yang ditunjukkan pada gambar berikut, setiap nilai kolom diambil dari urutan siklus yang sama dari periode 6 , mulai dari offset yang berbeda. Dalam kode di atas, kita menggunakan - ~ H bukan hanya + H karena kita perlu memaksa H ke integer. Maka dari itu offset (5,3,1) bukannya (0,4,2) .
sumber
H
di[0,6)
dan keluaran di[0,1]
save beberapa byte?Mathematica, 155 byte
Cobalah online!
sumber
Hue
HSB (AKA HSV) bukan HSL (lihat gambar 2a dan 2b di halaman Wikipedia yang terhubung).RGBColor
ada tapiHSLColor
tidak. > _>Python 2 , 32 byte
Cobalah online!
Fungsi ini sebenarnya dibangun ke dalam Python melalui bagian
hls_to_rgb
dalamcolorsys
perpustakaan. Input format tambang adalah rentang 0-1 dari HLS (bukan HSL, keduanya adalah akronim umum untuk hal yang sama [meskipun, HSL lebih umum]). Dan tambang menghasilkan nilai RGB dalam tupel dengan rentang dari 0 hingga 1.Kredit
Terima kasih kepada Jonathan Allan untuk menunjukkan bahwa saya hanya perlu mengimpornya (dan kemudian membantu saya mengurangi jumlah byte).
sumber
from colorsys import hls_to_rgb
karena daripada memberi kita fungsi yang dapat digunakan kembali. Edit - jadikan 21 sebagaifrom colorsys import*
.import colorsys
untuk 15!C ++,
228221 byte-7 byte terima kasih kepada Zacharý
Argumen keduanya adalah array yang memiliki ukuran minimal 3 elemen (yaitu
float hsl[3]
danint rgb[3]
Baik. Sekarang, bagaimana cara kerjanya? Apa itu array panjang?
Yah, ini bukan array panjang, ini
int
array. Di samping lelucon, array menunjukkan dengan berapa banyak posisi kita menggeser CX dan 0 ketika kita ingin memilih permutasi yang benar, + 2. Ingat bagaimana R ', G' dan B 'dipilih?Katakanlah kita memiliki urutan "normal" yaitu {C, X, 0}
Sekarang, ketika permutasi pertama (yaitu {C, X, 0}) dipilih, Anda tidak perlu menggeser, yang persis sama dengan pergeseran kanan oleh 0. Jadi 3 elemen pertama dari array adalah 0,0 dan 0
Untuk permutasi kedua ({X, C, 0}), kita perlu menggeser ke kanan C sebesar 1, dan menggeser ke kiri X sebesar -1, sehingga elemen array keempat, kelima dan keenam adalah 1, -1 dan 0
Dan seterusnya...
Dengan kasus permutasi ke-3 dan ke-4, saya harus ke kiri menggeser 0 dengan 2, jadi bergeser ke kanan dengan -2. Karena ada lebih dari 2 angka yang negatif, saya lebih suka menambahkan 2 untuk setiap elemen dalam array dan mengurangi 2 pada saat runtime (untuk alasan bermain golf, hanya memiliki seluruh angka dalam array).
sumber
Python 2 ,
119112 byteCobalah online!
Mengambil input sebagai
H=[0,6[, S=[0,1], L=[0,1]
sumber
HTML + JavaScript (ES6), 8 + 88 = 96 byte
Mengambil input sebagai sudut dan dua persentase. Saya mencetak snippet HTML
<p id=p>
dan fungsi tanda panah JavaScript. Saya tidak tahu apa yang digunakan browser pembulatan, jadi jawaban saya mungkin sedikit berbeda dari milik Anda.sumber
Cepat 4, 218 byte
Menerima nilai HSL dalam rentang [0,1] sebagai argumen, dan mengembalikan array yang berisi nilai RGB dalam rentang yang sama:
Idenya adalah untuk mengkonversi input pertama dari HSL ke HSB, kemudian menggunakan konstruktor HSB dari objek warna bawaan di Cocoa untuk mengambil nilai RGB.
Versi UIKit memiliki panjang yang sama persis, karena satu-satunya penggantian adalah:
Cocoa
→UIKit
NSColor
→UIColor
Tidak Disatukan:
Potongan berikut dapat digunakan untuk pengujian, dengan hanya mengganti nilai-nilai
h
,s
danl
:Sayangnya saya tidak dapat memberikan tautan ke kotak pasir online, karena semuanya berjalan di Linux, yang tidak termasuk Cocoa.
sumber
GLSL (GL_ES)
160 144 134131 byteHue berada di kisaran 0-6 (menghemat 3 byte)
Sat, light dan rgb 0-1
Cobalah di buku shader
Alat colorpicker yang digunakan pada printscreen untuk menguji output yang benar,
kecuali kesalahan kecil pada 202 19 39 → 81 104 118, yang memberi 80 104 118
sumber
R , 88 byte
Cobalah online!
Fungsi ini sebagai input nilai H, S, dan L sebagai nilai rentang 0-1 dan menghasilkan nilai RGB sebagai nilai rentang 0-255. Ia mengubah representasi HSL ke representasi HSV, kemudian menggunakan
hsv()
untuk mengubah representasi HSV ke warna R (yaitu representasi hex - #rrggbb), kemudian digunakancol2rgb()
untuk mengubah warna R ke nilai RGB.sumber
Jelly ,
3932 byte-1 berkat caird coinheringaahing (
%2
hanya sajaḂ
)-1 dan / atau inspirasi untuk -4 terima kasih kepada caird coinheringaahing juga!
Program lengkap yang mengambil tiga argumen baris perintah:
L
,H
,S
Dalam rentang[0,1)
,[0,6)
dan[0,1)
masing-masingyang mencetak daftar yang memberikan format RGB sebagai
[R, G, B]
dengan masing-masing dari tiga nilai dalam rentang[0,1]
Catatan:
H
mungkin juga membungkus seperti biasa[0,360)
.Cobalah online!
Bagaimana?
sumber