summaryrefslogtreecommitdiff
path: root/index.html
diff options
context:
space:
mode:
authorJulie Lala <jules@okfoc.us>2014-08-22 18:52:11 -0400
committerJulie Lala <jules@okfoc.us>2014-08-22 18:52:11 -0400
commitc2a25198a22c1205f0d134fa27ccc21379675b52 (patch)
tree583500fc3310bc4c097dd21ec11d8d4be867f81e /index.html
cielab color picker
Diffstat (limited to 'index.html')
-rw-r--r--index.html147
1 files changed, 147 insertions, 0 deletions
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..2ddbab5
--- /dev/null
+++ b/index.html
@@ -0,0 +1,147 @@
+<style>
+#cursor { position: fixed; top: -100px; left: -100px; margin-left: -5px; margin-top: -5px; width: 5px; height: 5px; border: 2px solid black; border-radius: 20px;
+</style>
+
+<canvas id="hunterlab"></canvas>
+<div id="cursor"></div>
+
+<br>
+L <input type="range" min="0" max="100" value="100" id="hunter_L">
+<br>
+a <input type="range" min="-86.185" max="98.294" id="hunter_a">
+<br>
+b <input type="range" min="-107.863" max="94.482" id="hunter_b">
+<br>
+<br>
+<input type="text" id="selected">
+<input type="text" id="hex">
+
+<script>
+var xyz = [0,0,0]
+var rgb = [0,0,0]
+
+w = hunterlab.width = 512
+h = hunterlab.height = 512
+ww = w-1, hh = h-1
+
+L_range = [0, 100]
+a_range = [-86.185, 98.254]
+b_range = [-107.863, 94.482]
+
+ctx = hunterlab.getContext('2d')
+
+ii = jj = -100
+down = false
+
+hunter_L.oninput = axis('L')
+hunter_a.oninput = axis('a')
+hunter_b.oninput = axis('b')
+hunterlab.onmousedown = function (e){
+ e.preventDefault()
+ down = true
+ ii = e.clientX - hunterlab.offsetLeft
+ jj = e.clientY - hunterlab.offsetTop
+ pick()
+}
+hunterlab.onmousemove = function(e){
+ if (! down) return
+ ii = e.clientX - hunterlab.offsetLeft
+ jj = e.clientY - hunterlab.offsetTop
+ pick()
+}
+document.body.onmouseup = function (e){
+ down = false
+}
+function pick () {
+ x = mix( ii/ww, x_range[0], x_range[1] )
+ y = mix( jj/hh, y_range[0], y_range[1] )
+ rgb = xyz2rgb(fn(val, x, y))
+ selected.value = "rgb(" + rgb.map(Math.round).join(",") + ")"
+ hex.value = "#" + rgb.map(Math.round).map(function(n){ var s = n.toString(16); return s.length == 1 ? "0"+s : s }).join("")
+ cursor.style.left = (ii + hunterlab.offsetTop) + "px"
+ cursor.style.top = (jj + hunterlab.offsetTop) + "px"
+}
+
+hunter_a.value = hunter_b.value = 0
+
+mode = "L"
+imageData = ctx.createImageData(w,h)
+data = imageData.data
+axis('L')()
+
+function axis (c) { return function(){ mode = c; paint() } }
+
+function paint () {
+ var fn_body = (hunterlab2xyz + "").split("{")[1].split("}")[0]
+ var fn_body = (hunterlab2xyz + "").split("{")[1].split("}")[0]
+ switch (mode) {
+ case 'L':
+ val = parseFloat(hunter_L.value)
+ x_range = a_range
+ y_range = b_range
+ fn = new Function('L','a','b', fn_body)
+ break
+ case 'a':
+ x_range = L_range
+ val = hunter_a.value
+ y_range = b_range
+ fn = new Function('a','L','b', fn_body)
+ break
+ case 'b':
+ x_range = L_range
+ y_range = a_range
+ val = hunter_b.value
+ fn = new Function('b','L','a', fn_body)
+ break
+ }
+ for (var i = 0; i < w; i++) {
+ for (var j = 0; j < h; j++) {
+ x = mix( i/ww, x_range[0], x_range[1] )
+ y = mix( j/hh, y_range[0], y_range[1] )
+ t = (j*w + i) * 4
+ rgb = xyz2rgb(fn(val, x, y))
+ data[t] = Math.round( rgb[0] )
+ data[t+1] = Math.round( rgb[1] )
+ data[t+2] = Math.round( rgb[2] )
+ data[t+3] = 255
+ }
+ }
+ ctx.putImageData(imageData,0,0)
+ if (ii > -1) { pick() }
+}
+
+function mix(n,a,b){ return n*a + (1-n)*b }
+function clamp(n,a,b){ return n<a?a:n<b?n:b }
+function hunterlab2xyz (L,a,b) {
+ var_Y = L / 10
+ var_X = a / 17.5 * L / 10
+ var_Z = b / 7 * L / 10
+
+ Y = Math.pow(var_Y, 2)
+ X = ( var_X + Y ) / 1.02
+ Z = -( var_Z - Y ) / 0.847
+ xyz = [X,Y,Z]
+}
+function xyz2rgb(){
+ var var_X = xyz[0] / 100 //X from 0 to 95.047 (Observer = 2°, Illuminant = D65)
+ var var_Y = xyz[1] / 100 //Y from 0 to 100.000
+ var var_Z = xyz[2] / 100 //Z from 0 to 108.883
+
+ var_R = var_X * 3.2406 + var_Y * -1.5372 + var_Z * -0.4986
+ var_G = var_X * -0.9689 + var_Y * 1.8758 + var_Z * 0.0415
+ var_B = var_X * 0.0557 + var_Y * -0.2040 + var_Z * 1.0570
+
+ if ( var_R > 0.0031308 ) var_R = 1.055 * Math.pow( var_R, 1 / 2.4 ) - 0.055
+ else var_R = 12.92 * var_R
+ if ( var_G > 0.0031308 ) var_G = 1.055 * Math.pow( var_G, 1 / 2.4 ) - 0.055
+ else var_G = 12.92 * var_G
+ if ( var_B > 0.0031308 ) var_B = 1.055 * Math.pow( var_B, 1 / 2.4 ) - 0.055
+ else var_B = 12.92 * var_B
+
+ rgb[0] = clamp(var_R * 255, 0, 255)
+ rgb[1] = clamp(var_G * 255, 0, 255)
+ rgb[2] = clamp(var_B * 255, 0, 255)
+ return rgb
+}
+
+</script>