JavaScript Tutorial/Development/Color
Версия от 18:52, 25 мая 2010; (обсуждение)
Using zColor Library
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>zColor Example</title>
<script type="text/javascript">
/*------------------------------------------------------------------------------
* JavaScript zColor Library
* Version 0.1
* by Nicholas C. Zakas, http://www.nczonline.net/
* Copyright (c) 2004-2005 Nicholas C. Zakas. All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*------------------------------------------------------------------------------
*/
/**
* Represents an RGB color.
* @class
* @scope public
* @constructor
* @param iRed The red value for the color (0-255)
* @param iGreen The green value for the color (0-255)
* @param iBlue The blue value for the color (0-255)
*/
function zRGB(iRed, iGreen, iBlue) {
/**
* The red value for the color.
* @scope public
*/
this.r /*:int */ = parseInt(iRed,10);
/**
* The green value for the color.
* @scope public
*/
this.g /*:int */ = parseInt(iGreen,10);
/**
* The blue value for the color.
* @scope public
*/
this.b /*:int */= parseInt(iBlue,10);
}
/**
* Creates an RGB color from a hex string.
* @scope public
* @param sHex The hex string.
* @return The RGB object for the hex string.
*/
zRGB.fromHexString = function (sHex /*: String */) /*:zRGB */ {
//eliminate the pound sign
if (sHex.charAt(0) == "#") {
sHex = sHex.substring(1);
} //ENd: if (sHex.charAt(0) == "#")
//extract and convert the red, green, and blue values
var iRed = parseInt(sHex.substring(0,2),16);
var iGreen = parseInt(sHex.substring(2,4),16);
var iBlue = parseInt(sHex.substring(4,6),16);
//return an array
return new zRGB(iRed,iGreen,iBlue);
};
/**
* Returns a hex representation of the color.
* @scope public
* @return A hex representation of the color.
*/
zRGB.prototype.toHexString = function () /*:String */ {
//extract and convert the red, green, and blue values
var sRed = this.r.toString(16).toUpperCase();
var sGreen = this.g.toString(16).toUpperCase();
var sBlue = this.b.toString(16).toUpperCase();
//make sure there are two digits in each code
if (sRed.length == 1) {
sRed = "0" + sRed;
} //End: if (sRed.length == 1)
if (sGreen.length == 1) {
sGreen = "0" + sGreen;
} //End: if (sGreen.length == 1)
if (sBlue.length == 1) {
sBlue = "0" + sBlue;
} //End: if (sBlue.length == 1)
//return the hex code
return "#" + sRed + sGreen + sBlue;
};
/**
* Returns an HSL representation of the color.
* @scope public
* @return An HSL representation of the color.
*/
zRGB.prototype.toHSL = function () /*:zHSL */ {
var iMax = Math.max(this.r, this.g, this.b);
var iMin = Math.min(this.r, this.g, this.b);
var iDelta = iMax-iMin;
var iLum = Math.round((iMax+iMin)/2);
var iHue = 0;
var iSat = 0;
if (iDelta > 0) {
iSat = Math.ceil(((iLum < (0.5*255)) ? iDelta/(iMax + iMin) : iDelta/((2*255)-iMax-iMin))*255);
var iRedC = (iMax-this.r)/iDelta;
var iGreenC = (iMax-this.g)/iDelta;
var iBlueC = (iMax-this.b)/iDelta;
if (this.r == iMax) {
iHue = iBlueC - iGreenC;
} else if (this.g == iMax) {
iHue = 2.0 + iRedC - iBlueC;
} else {
iHue = 4.0 + iGreenC - iRedC;
}
iHue /= 6.0;
if (iHue < 0) {
iHue += 1.0;
}
iHue = Math.round(iHue * 255);
}
return new zHSL(iHue,iSat,iLum);
};
/**
* Returns the color in a string form.
* @scope public
* @return The color in a string form.
*/
zRGB.prototype.toString = function () /*:String */ {
return "rgb(" + this.r + "," + this.g + "," + this.b + ")";
};
/**
* Represents an HSL color.
* @class
* @scope public
* @constructor
* @param iHue The hue value for the color (0-255)
* @param iSat The saturation value for the color (0-255)
* @param iLum The luminosity value for the color (0-255)
*/
function zHSL(iHue, iSat, iLum) {
/**
* The hue value for the color.
* @scope public
*/
this.h /*:int */ = parseInt(iHue,10);
/**
* The saturation value for the color.
* @scope public
*/
this.s /*:int */ = parseInt(iSat,10);
/**
* The luminosity value for the color.
* @scope public
*/
this.l /*:int */= parseInt(iLum,10);
}
/**
* Converts the color into RGB form.
* @scope public
* @return An RGB version of the color.
*/
zHSL.prototype.toRGB = function () /*:zRGB */ {
iHue = this.h/255;
iSat = this.s/255;
iLum = this.l/255;
var iRed, iGreen, iBlue;
if (iSat == 0) {
iRed = iGreen = iBlue = iLum;
} else {
var m1, m2;
if (iLum <= 0.5) {
m2 = iLum * (1+iSat);
} else {
m2 = iLum + iSat - (iLum * iSat);
}
m1 = 2.0 * iLum - m2;
hf2 = iHue + 1/3;
if (hf2 < 0) hf2 = hf2 + 1;
if (hf2 > 1) hf2 = hf2 - 1;
if (6 * hf2 < 1) {
iRed = (m1+(m2-m1)*hf2*6);
} else {
if (2 * hf2 < 1) {
iRed = m2;
} else {
if (3.0*hf2 < 2.0) {
iRed = (m1+(m2-m1)*((2.0/3.0)-hf2)*6.0);
} else {
iRed = m1;
}
}
}
//Calculate Green
if (iHue < 0) {iHue = iHue + 1.0;}
if (iHue > 1) {iHue = iHue - 1.0;}
if (6.0 * iHue < 1){
iGreen = (m1+(m2-m1)*iHue*6.0);}
else {
if (2.0 * iHue < 1){
iGreen = m2;
} else {
if (3.0*iHue < 2.0) {
iGreen = (m1+(m2-m1)*((2.0/3.0)-iHue)*6.0);
} else {
iGreen = m1;
}
}
}
//Calculate Blue
hf2=iHue-1.0/3.0;
if (hf2 < 0) {hf2 = hf2 + 1.0;}
if (hf2 > 1) {hf2 = hf2 - 1.0;}
if (6.0 * hf2 < 1) {
iBlue = (m1+(m2-m1)*hf2*6.0);
} else {
if (2.0 * hf2 < 1){
iBlue = m2;
} else {
if (3.0*hf2 < 2.0) {
iBlue = (m1+(m2-m1)*((2.0/3.0)-hf2)*6.0);
} else {
iBlue = m1;
}
}
}
}
return new zRGB(Math.round(iRed*255),Math.round(iGreen*255),Math.round(iBlue*255));
};
/**
* Returns the color in a string form.
* @scope public
* @return The color in a string form.
*/
zHSL.prototype.toString = function () /*:String */ {
return "hsl(" + this.h + "," + this.s + "," + this.l + ")";
};
</script>
<script type="text/javascript">
function convertToHSL() {
var iRed = parseInt(document.getElementById("txtRed").value);
var iBlue = parseInt(document.getElementById("txtBlue").value);
var iGreen = parseInt(document.getElementById("txtGreen").value);
var oRGB = new zRGB(iRed, iGreen, iBlue);
var oHSL = oRGB.toHSL();
document.getElementById("txtHue").value = oHSL.h;
document.getElementById("txtSat").value = oHSL.s;
document.getElementById("txtLum").value = oHSL.l;
}
function convertToRGB() {
var iHue = parseInt(document.getElementById("txtHue").value);
var iSat = parseInt(document.getElementById("txtSat").value);
var iLum = parseInt(document.getElementById("txtLum").value);
var oHSL = new zHSL(iHue, iSat, iLum);
var oRGB = oHSL.toRGB();
document.getElementById("txtRed").value = oRGB.r;
document.getElementById("txtGreen").value = oRGB.g;
document.getElementById("txtBlue").value = oRGB.b;
}
</script>
</head>
<body>
<form>
<table border="0">
<tr>
<td>
R: <input type="text" id="txtRed" /><br />
G: <input type="text" id="txtGreen" /><br />
B: <input type="text" id="txtBlue" /><br />
<input type="button" value="to HSL ->" onclick="convertToHSL()"/>
</td>
<td>
H: <input type="text" id="txtHue" /><br />
S: <input type="text" id="txtSat" /><br />
L: <input type="text" id="txtLum" /><br />
<input type="button" value="<- to RGB" onclick="convertToRGB()"/>
</td>
</tr>
</table>
</form>
</body>
</html>