Added the Saturation and Lightness transformation for HSL color scheme

This commit is contained in:
Dominick Pham 2009-08-11 22:09:19 -04:00
parent 3ab509a368
commit 5f11169ef1
3 changed files with 73 additions and 24 deletions

View file

@ -84,7 +84,7 @@ a:hover { text-decoration: underline; }
width: 370px; width: 370px;
} }
#img_submit, #hsv a { #img_submit, #hsv a, #hsl a {
border: 1px solid #55a2c9; border: 1px solid #55a2c9;
background-color: #498fb2; background-color: #498fb2;
color: #fff; color: #fff;
@ -92,7 +92,7 @@ a:hover { text-decoration: underline; }
-moz-border-radius: 4px; -moz-border-radius: 4px;
-webkit-border-radius: 4px; -webkit-border-radius: 4px;
} }
#hsv a { #hsv a, #hsl a {
display: block; display: block;
width: 104px; width: 104px;
padding: 0 5px; padding: 0 5px;
@ -101,6 +101,10 @@ a:hover { text-decoration: underline; }
margin-right: 15px; margin-right: 15px;
text-decoration: none; text-decoration: none;
} }
#hsl a {
width: 150px;
}
#try_these { #try_these {
clear: both; clear: both;
} }

View file

@ -16,6 +16,7 @@
$("#franz_form").submit(function() { $("#franz_form").submit(function() {
franz.loadImg(img_input.value); franz.loadImg(img_input.value);
$("#hsv").removeClass("hideme"); $("#hsv").removeClass("hideme");
$("#hsl").removeClass("hideme");
return false; return false;
}); });
@ -28,16 +29,22 @@
franz.displayHue(); franz.displayHue();
return false; return false;
}); });
$("#sort_sat").click(function(event){ $("#sort_sat").click(function(event){
franz.displaySat(); franz.displaySat();
return false; return false;
}); });
$("#sort_val").click(function(event){ $("#sort_val").click(function(event){
franz.displayVal(); franz.displayVal();
return false; return false;
}); });
$("#sort_light").click(function(event){
franz.displayLight();
return false;
});
$("#sort_satL").click(function(event){
franz.displaySatL();
return false;
});
}); });
</script> </script>
</head> </head>
@ -57,6 +64,7 @@
<input type="submit" id="img_submit" value="Go for it!"> <input type="submit" id="img_submit" value="Go for it!">
</form> </form>
<p id="hsv" class="hideme"><a href="#" id="sort_hue">Sort Hue</a> <a href="#" id="sort_sat">Sort Saturation</a> <a href="#" id="sort_val">Sort Value</a> </p> <p id="hsv" class="hideme"><a href="#" id="sort_hue">Sort Hue</a> <a href="#" id="sort_sat">Sort Saturation</a> <a href="#" id="sort_val">Sort Value</a> </p>
<p id="hsl" class="hideme"><a href="#" id="sort_satL">Sort Saturation HSL</a> <a href="#" id="sort_light">Sort Lightness</a> </p>
<p id="try_these"><strong>Try out:</strong> <a href="#">lol.png</a>, <a href="#">testjubs.jpg</a>, <a href="#">stars.jpg</a>, <a href="#">1600.jpg</a>, <a href="#">fallout.jpg</a></p> <p id="try_these"><strong>Try out:</strong> <a href="#">lol.png</a>, <a href="#">testjubs.jpg</a>, <a href="#">stars.jpg</a>, <a href="#">1600.jpg</a>, <a href="#">fallout.jpg</a></p>
</div> </div>

View file

@ -18,7 +18,6 @@ var franz = {
canvas: {}, canvas: {},
ctx: {}, ctx: {},
img: {}, img: {},
final_colors: [],
red: [], red: [],
green: [], green: [],
blue: [], blue: [],
@ -26,6 +25,8 @@ var franz = {
hue: [], hue: [],
sat: [], sat: [],
val: [], val: [],
satL: [],
light: [],
origIndex: [], origIndex: [],
init: function(canvas_id) { init: function(canvas_id) {
@ -75,7 +76,7 @@ var franz = {
} }
/* get hue sat val array */ /* get hue sat val array */
franz.RGBtoHSV(); franz.RGBtoHSVHL();
/* show original image */ /* show original image */
franz.displayImg(); franz.displayImg();
@ -83,33 +84,23 @@ var franz = {
return false; return false;
}, },
/* Converts RGB to the Hue/Saturation/Value model */ /* Converts RGB to the Hue/Saturation/Value, Saturation/Lightness model */
RGBtoHSV: function() { RGBtoHSVHL: function() {
var min, max, delta; var min, max;
for(var i = 0; i < franz.alpha.length; i++) { for(var i = 0; i < franz.alpha.length; i++) {
franz.val[i] = franz.getValHSV(franz.red[i],franz.green[i],franz.blue[i]); franz.val[i] = franz.getValHSV(franz.red[i],franz.green[i],franz.blue[i]);
franz.sat[i] = franz.getSatHSV(franz.red[i],franz.green[i],franz.blue[i]); franz.sat[i] = franz.getSatHSV(franz.red[i],franz.green[i],franz.blue[i]);
franz.hue[i] = franz.getHueHSV(franz.red[i],franz.green[i],franz.blue[i]); franz.hue[i] = franz.getHue(franz.red[i],franz.green[i],franz.blue[i]);
franz.satL[i] = franz.getSatHSL(franz.red[i],franz.green[i],franz.blue[i]);
franz.light[i] = franz.getLightHSL(franz.red[i],franz.green[i],franz.blue[i]);
} }
return false return false
}, },
getValHSV: function(red, green, blue) { return Math.max(red,Math.max(green,blue)); }, getHue: function(red,green,blue) {
getSatHSV: function(red, green, blue) {
var min, max, delta, sat;
min = Math.min(red,Math.min(green,blue));
max = Math.max(red,Math.max(green,blue));
delta = max - min;
sat = delta / max;
return sat;
},
getHueHSV: function(red,green,blue) {
var min, max, delta, hue; var min, max, delta, hue;
min = Math.min(red,Math.min(green,blue)); min = Math.min(red,Math.min(green,blue));
@ -134,6 +125,40 @@ var franz = {
return hue; return hue;
}, },
getSatHSV: function(red, green, blue) {
var min, max, delta, sat;
min = Math.min(red,Math.min(green,blue));
max = Math.max(red,Math.max(green,blue));
delta = max - min;
sat = delta / max;
return sat;
},
getValHSV: function(red, green, blue) { return Math.max(red,Math.max(green,blue)); },
getSatHSL: function(red, green, blue) {
var min, max, sat;
var lightness = franz.getLightHSL();
min = Math.min(red,Math.min(green,blue));
max = Math.max(red,Math.max(green,blue));
if (min == max) return 0;
if (lightness < 1/2) sat = (max-min)/(max+min);
else sat = (max-min)/(2 - (max+min));
return sat;
},
getLightHSL: function(red, green, blue) {
var min, max;
min = Math.min(red,Math.min(green,blue));
max = Math.max(red,Math.max(green,blue));
return 1/2*(min+max);
},
/* routines to display color swatches */ /* routines to display color swatches */
displayColors: function(order_array) { displayColors: function(order_array) {
@ -180,6 +205,18 @@ var franz = {
franz.displayColors(franz.origIndex); franz.displayColors(franz.origIndex);
return false; return false;
}, },
displaySatL: function() {
franz.resetIndex();
franz.qsort(franz.clone(franz.satL), 0, franz.alpha.length);
franz.displayColors(franz.origIndex);
return false;
},
displayLight: function() {
franz.resetIndex();
franz.qsort(franz.clone(franz.light), 0, franz.alpha.length);
franz.displayColors(franz.origIndex);
return false;
},
/* quicksort algorithm that also swaps an index array */ /* quicksort algorithm that also swaps an index array */