colorspace.js

来自「Hippo CMS是一个以信息为中心的开源内容管理系统。Hippo CMS目标是」· JavaScript 代码 · 共 724 行 · 第 1/2 页

JS
724
字号
/*
	Copyright (c) 2004-2006, The Dojo Foundation
	All Rights Reserved.

	Licensed under the Academic Free License version 2.1 or above OR the
	modified BSD license. For more information on Dojo licensing, see:

		http://dojotoolkit.org/community/licensing.shtml
*/



dojo.provide("dojo.gfx.Colorspace");
dojo.require("dojo.lang.common");
dojo.require("dojo.math.matrix");
dojo.gfx.Colorspace = function () {
	this.whitePoint = "D65";
	this.stdObserver = "10";
	this.chromaticAdaptationAlg = "bradford";
	this.RGBWorkingSpace = "s_rgb";
	this.useApproxCIELabMapping = 1;
	this.chainMaps = {"RGB_to_xyY":["XYZ"], "xyY_to_RGB":["XYZ"], "RGB_to_Lab":["XYZ"], "Lab_to_RGB":["XYZ"], "RGB_to_LCHab":["XYZ", "Lab"], "LCHab_to_RGB":["Lab"], "xyY_to_Lab":["XYZ"], "Lab_to_xyY":["XYZ"], "XYZ_to_LCHab":["Lab"], "LCHab_to_XYZ":["Lab"], "xyY_to_LCHab":["XYZ", "Lab"], "LCHab_to_xyY":["Lab", "XYZ"], "RGB_to_Luv":["XYZ"], "Luv_to_RGB":["XYZ"], "xyY_to_Luv":["XYZ"], "Luv_to_xyY":["XYZ"], "Lab_to_Luv":["XYZ"], "Luv_to_Lab":["XYZ"], "LCHab_to_Luv":["Lab", "XYZ"], "Luv_to_LCHab":["XYZ", "Lab"], "RGB_to_LCHuv":["XYZ", "Luv"], "LCHuv_to_RGB":["Luv", "XYZ"], "XYZ_to_LCHuv":["Luv"], "LCHuv_to_XYZ":["Luv"], "xyY_to_LCHuv":["XYZ", "Luv"], "LCHuv_to_xyY":["Luv", "XYZ"], "Lab_to_LCHuv":["XYZ", "Luv"], "LCHuv_to_Lab":["Luv", "XYZ"], "LCHab_to_LCHuv":["Lab", "XYZ", "Luv"], "LCHuv_to_LCHab":["Luv", "XYZ", "Lab"], "XYZ_to_CMY":["RGB"], "CMY_to_XYZ":["RGB"], "xyY_to_CMY":["RGB"], "CMY_to_xyY":["RGB"], "Lab_to_CMY":["RGB"], "CMY_to_Lab":["RGB"], "LCHab_to_CMY":["RGB"], "CMY_to_LCHab":["RGB"], "Luv_to_CMY":["RGB"], "CMY_to_Luv":["RGB"], "LCHuv_to_CMY":["RGB"], "CMY_to_LCHuv":["RGB"], "XYZ_to_HSL":["RGB"], "HSL_to_XYZ":["RGB"], "xyY_to_HSL":["RGB"], "HSL_to_xyY":["RGB"], "Lab_to_HSL":["RGB"], "HSL_to_Lab":["RGB"], "LCHab_to_HSL":["RGB"], "HSL_to_LCHab":["RGB"], "Luv_to_HSL":["RGB"], "HSL_to_Luv":["RGB"], "LCHuv_to_HSL":["RGB"], "HSL_to_LCHuv":["RGB"], "CMY_to_HSL":["RGB"], "HSL_to_CMY":["RGB"], "CMYK_to_HSL":["RGB"], "HSL_to_CMYK":["RGB"], "XYZ_to_HSV":["RGB"], "HSV_to_XYZ":["RGB"], "xyY_to_HSV":["RGB"], "HSV_to_xyY":["RGB"], "Lab_to_HSV":["RGB"], "HSV_to_Lab":["RGB"], "LCHab_to_HSV":["RGB"], "HSV_to_LCHab":["RGB"], "Luv_to_HSV":["RGB"], "HSV_to_Luv":["RGB"], "LCHuv_to_HSV":["RGB"], "HSV_to_LCHuv":["RGB"], "CMY_to_HSV":["RGB"], "HSV_to_CMY":["RGB"], "CMYK_to_HSV":["RGB"], "HSV_to_CMYK":["RGB"], "HSL_to_HSV":["RGB"], "HSV_to_HSL":["RGB"], "XYZ_to_CMYK":["RGB"], "CMYK_to_XYZ":["RGB"], "xyY_to_CMYK":["RGB"], "CMYK_to_xyY":["RGB"], "Lab_to_CMYK":["RGB"], "CMYK_to_Lab":["RGB"], "LCHab_to_CMYK":["RGB"], "CMYK_to_LCHab":["RGB"], "Luv_to_CMYK":["RGB"], "CMYK_to_Luv":["RGB"], "LCHuv_to_CMYK":["RGB"], "CMYK_to_LCHuv":["RGB"]};
	return this;
};
dojo.gfx.Colorspace.prototype.convert = function (col, model_from, model_to) {
	var k = model_from + "_to_" + model_to;
	if (this[k]) {
		return this[k](col);
	} else {
		if (this.chainMaps[k]) {
			var cur = model_from;
			var models = this.chainMaps[k].concat();
			models.push(model_to);
			for (var i = 0; i < models.length; i++) {
				col = this.convert(col, cur, models[i]);
				cur = models[i];
			}
			return col;
		} else {
			dojo.debug("Can't convert from " + model_from + " to " + model_to);
		}
	}
};
dojo.gfx.Colorspace.prototype.munge = function (keys, args) {
	if (dojo.lang.isArray(args[0])) {
		args = args[0];
	}
	var out = new Array();
	for (var i = 0; i < keys.length; i++) {
		out[keys.charAt(i)] = args[i];
	}
	return out;
};
dojo.gfx.Colorspace.prototype.getWhitePoint = function () {
	var x = 0;
	var y = 0;
	var t = 0;
	switch (this.stdObserver) {
	  case "2":
		switch (this.whitePoint) {
		  case "E":
			x = 1 / 3;
			y = 1 / 3;
			t = 5400;
			break;
		  case "D50":
			x = 0.34567;
			y = 0.3585;
			t = 5000;
			break;
		  case "D55":
			x = 0.33242;
			y = 0.34743;
			t = 5500;
			break;
		  case "D65":
			x = 0.31271;
			y = 0.32902;
			t = 6500;
			break;
		  case "D75":
			x = 0.29902;
			y = 0.31485;
			t = 7500;
			break;
		  case "A":
			x = 0.44757;
			y = 0.40745;
			t = 2856;
			break;
		  case "B":
			x = 0.34842;
			y = 0.35161;
			t = 4874;
			break;
		  case "C":
			x = 0.31006;
			y = 0.31616;
			t = 6774;
			break;
		  case "9300":
			x = 0.2848;
			y = 0.2932;
			t = 9300;
			break;
		  case "F2":
			x = 0.37207;
			y = 0.37512;
			t = 4200;
			break;
		  case "F7":
			x = 0.31285;
			y = 0.32918;
			t = 6500;
			break;
		  case "F11":
			x = 0.38054;
			y = 0.37691;
			t = 4000;
			break;
		  default:
			dojo.debug("White point " + this.whitePoint + " isn't defined for Std. Observer " + this.strObserver);
		}
		break;
	  case "10":
		switch (this.whitePoint) {
		  case "E":
			x = 1 / 3;
			y = 1 / 3;
			t = 5400;
			break;
		  case "D50":
			x = 0.34773;
			y = 0.35952;
			t = 5000;
			break;
		  case "D55":
			x = 0.33411;
			y = 0.34877;
			t = 5500;
			break;
		  case "D65":
			x = 0.31382;
			y = 0.331;
			t = 6500;
			break;
		  case "D75":
			x = 0.29968;
			y = 0.3174;
			t = 7500;
			break;
		  case "A":
			x = 0.45117;
			y = 0.40594;
			t = 2856;
			break;
		  case "B":
			x = 0.3498;
			y = 0.3527;
			t = 4874;
			break;
		  case "C":
			x = 0.31039;
			y = 0.31905;
			t = 6774;
			break;
		  case "F2":
			x = 0.37928;
			y = 0.36723;
			t = 4200;
			break;
		  case "F7":
			x = 0.31565;
			y = 0.32951;
			t = 6500;
			break;
		  case "F11":
			x = 0.38543;
			y = 0.3711;
			t = 4000;
			break;
		  default:
			dojo.debug("White point " + this.whitePoint + " isn't defined for Std. Observer " + this.strObserver);
		}
		break;
	  default:
		dojo.debug("Std. Observer " + this.strObserver + " isn't defined");
	}
	var z = 1 - x - y;
	var wp = {"x":x, "y":y, "z":z, "t":t};
	wp.Y = 1;
	var XYZ = this.xyY_to_XYZ([wp.x, wp.y, wp.Y]);
	wp.X = XYZ[0];
	wp.Y = XYZ[1];
	wp.Z = XYZ[2];
	return wp;
};
dojo.gfx.Colorspace.prototype.getPrimaries = function () {
	var m = [];
	switch (this.RGBWorkingSpace) {
	  case "adobe_rgb_1998":
		m = [2.2, "D65", 0.64, 0.33, 0.297361, 0.21, 0.71, 0.627355, 0.15, 0.06, 0.075285];
		break;
	  case "apple_rgb":
		m = [1.8, "D65", 0.625, 0.34, 0.244634, 0.28, 0.595, 0.672034, 0.155, 0.07, 0.083332];
		break;
	  case "best_rgb":
		m = [2.2, "D50", 0.7347, 0.2653, 0.228457, 0.215, 0.775, 0.737352, 0.13, 0.035, 0.034191];
		break;
	  case "beta_rgb":
		m = [2.2, "D50", 0.6888, 0.3112, 0.303273, 0.1986, 0.7551, 0.663786, 0.1265, 0.0352, 0.032941];
		break;
	  case "bruce_rgb":
		m = [2.2, "D65", 0.64, 0.33, 0.240995, 0.28, 0.65, 0.683554, 0.15, 0.06, 0.075452];
		break;
	  case "cie_rgb":
		m = [2.2, "E", 0.735, 0.265, 0.176204, 0.274, 0.717, 0.812985, 0.167, 0.009, 0.010811];
		break;
	  case "color_match_rgb":
		m = [1.8, "D50", 0.63, 0.34, 0.274884, 0.295, 0.605, 0.658132, 0.15, 0.075, 0.066985];
		break;
	  case "don_rgb_4":
		m = [2.2, "D50", 0.696, 0.3, 0.27835, 0.215, 0.765, 0.68797, 0.13, 0.035, 0.03368];
		break;
	  case "eci_rgb":
		m = [1.8, "D50", 0.67, 0.33, 0.32025, 0.21, 0.71, 0.602071, 0.14, 0.08, 0.077679];
		break;
	  case "ekta_space_ps5":
		m = [2.2, "D50", 0.695, 0.305, 0.260629, 0.26, 0.7, 0.734946, 0.11, 0.005, 0.004425];
		break;
	  case "ntsc_rgb":
		m = [2.2, "C", 0.67, 0.33, 0.298839, 0.21, 0.71, 0.586811, 0.14, 0.08, 0.11435];
		break;
	  case "pal_secam_rgb":
		m = [2.2, "D65", 0.64, 0.33, 0.222021, 0.29, 0.6, 0.706645, 0.15, 0.06, 0.071334];
		break;
	  case "pro_photo_rgb":
		m = [1.8, "D50", 0.7347, 0.2653, 0.28804, 0.1596, 0.8404, 0.711874, 0.0366, 0.0001, 0.000086];
		break;
	  case "smpte-c_rgb":
		m = [2.2, "D65", 0.63, 0.34, 0.212395, 0.31, 0.595, 0.701049, 0.155, 0.07, 0.086556];
		break;
	  case "s_rgb":
		m = [2.2, "D65", 0.64, 0.33, 0.212656, 0.3, 0.6, 0.715158, 0.15, 0.06, 0.072186];
		break;
	  case "wide_gamut_rgb":
		m = [2.2, "D50", 0.735, 0.265, 0.258187, 0.115, 0.826, 0.724938, 0.157, 0.018, 0.016875];
		break;
	  default:
		dojo.debug("RGB working space " + this.RGBWorkingSpace + " isn't defined");
	}
	var p = {name:this.RGBWorkingSpace, gamma:m[0], wp:m[1], xr:m[2], yr:m[3], Yr:m[4], xg:m[5], yg:m[6], Yg:m[7], xb:m[8], yb:m[9], Yb:m[10]};
	if (p.wp != this.whitePoint) {
		var r = this.XYZ_to_xyY(this.chromaticAdaptation(this.xyY_to_XYZ([p.xr, p.yr, p.Yr]), p.wp, this.whitePoint));
		var g = this.XYZ_to_xyY(this.chromaticAdaptation(this.xyY_to_XYZ([p.xg, p.yg, p.Yg]), p.wp, this.whitePoint));
		var b = this.XYZ_to_xyY(this.chromaticAdaptation(this.xyY_to_XYZ([p.xb, p.yb, p.Yb]), p.wp, this.whitePoint));
		p.xr = r[0];
		p.yr = r[1];
		p.Yr = r[2];
		p.xg = g[0];
		p.yg = g[1];
		p.Yg = g[2];
		p.xb = b[0];
		p.yb = b[1];
		p.Yb = b[2];
		p.wp = this.whitePoint;
	}
	p.zr = 1 - p.xr - p.yr;
	p.zg = 1 - p.xg - p.yg;
	p.zb = 1 - p.xb - p.yb;
	return p;
};
dojo.gfx.Colorspace.prototype.epsilon = function () {
	return this.useApproxCIELabMapping ? 0.008856 : 216 / 24289;
};
dojo.gfx.Colorspace.prototype.kappa = function () {
	return this.useApproxCIELabMapping ? 903.3 : 24389 / 27;
};
dojo.gfx.Colorspace.prototype.XYZ_to_xyY = function () {
	var src = this.munge("XYZ", arguments);
	var sum = src.X + src.Y + src.Z;
	if (sum == 0) {
		var wp = this.getWhitePoint();
		var x = wp.x;
		var y = wp.y;
	} else {
		var x = src.X / sum;
		var y = src.Y / sum;
	}
	var Y = src.Y;
	return [x, y, Y];
};
dojo.gfx.Colorspace.prototype.xyY_to_XYZ = function () {
	var src = this.munge("xyY", arguments);
	if (src.y == 0) {
		var X = 0;
		var Y = 0;
		var Z = 0;
	} else {
		var X = (src.x * src.Y) / src.y;
		var Y = src.Y;
		var Z = ((1 - src.x - src.y) * src.Y) / src.y;
	}
	return [X, Y, Z];
};
dojo.gfx.Colorspace.prototype.RGB_to_XYZ = function () {
	var src = this.munge("RGB", arguments);
	var m = this.getRGB_XYZ_Matrix();
	var pr = this.getPrimaries();
	if (this.RGBWorkingSpace == "s_rgb") {
		var r = (src.R > 0.04045) ? Math.pow(((src.R + 0.055) / 1.055), 2.4) : src.R / 12.92;
		var g = (src.G > 0.04045) ? Math.pow(((src.G + 0.055) / 1.055), 2.4) : src.G / 12.92;
		var b = (src.B > 0.04045) ? Math.pow(((src.B + 0.055) / 1.055), 2.4) : src.B / 12.92;
	} else {
		var r = Math.pow(src.R, pr.gamma);
		var g = Math.pow(src.G, pr.gamma);
		var b = Math.pow(src.B, pr.gamma);
	}
	var XYZ = dojo.math.matrix.multiply([[r, g, b]], m);
	return [XYZ[0][0], XYZ[0][1], XYZ[0][2]];
};
dojo.gfx.Colorspace.prototype.XYZ_to_RGB = function () {
	var src = this.munge("XYZ", arguments);
	var mi = this.getXYZ_RGB_Matrix();
	var pr = this.getPrimaries();
	var rgb = dojo.math.matrix.multiply([[src.X, src.Y, src.Z]], mi);
	var r = rgb[0][0];
	var g = rgb[0][1];
	var b = rgb[0][2];
	if (this.RGBWorkingSpace == "s_rgb") {
		var R = (r > 0.0031308) ? (1.055 * Math.pow(r, 1 / 2.4)) - 0.055 : 12.92 * r;
		var G = (g > 0.0031308) ? (1.055 * Math.pow(g, 1 / 2.4)) - 0.055 : 12.92 * g;
		var B = (b > 0.0031308) ? (1.055 * Math.pow(b, 1 / 2.4)) - 0.055 : 12.92 * b;
	} else {
		var R = Math.pow(r, 1 / pr.gamma);
		var G = Math.pow(g, 1 / pr.gamma);
		var B = Math.pow(b, 1 / pr.gamma);
	}
	return [R, G, B];
};
dojo.gfx.Colorspace.prototype.XYZ_to_Lab = function () {
	var src = this.munge("XYZ", arguments);
	var wp = this.getWhitePoint();
	var xr = src.X / wp.X;
	var yr = src.Y / wp.Y;
	var zr = src.Z / wp.Z;
	var fx = (xr > this.epsilon()) ? Math.pow(xr, 1 / 3) : (this.kappa() * xr + 16) / 116;
	var fy = (yr > this.epsilon()) ? Math.pow(yr, 1 / 3) : (this.kappa() * yr + 16) / 116;
	var fz = (zr > this.epsilon()) ? Math.pow(zr, 1 / 3) : (this.kappa() * zr + 16) / 116;
	var L = 116 * fy - 16;
	var a = 500 * (fx - fy);
	var b = 200 * (fy - fz);
	return [L, a, b];
};
dojo.gfx.Colorspace.prototype.Lab_to_XYZ = function () {
	var src = this.munge("Lab", arguments);
	var wp = this.getWhitePoint();
	var yr = (src.L > (this.kappa() * this.epsilon())) ? Math.pow((src.L + 16) / 116, 3) : src.L / this.kappa();
	var fy = (yr > this.epsilon()) ? (src.L + 16) / 116 : (this.kappa() * yr + 16) / 116;
	var fx = (src.a / 500) + fy;
	var fz = fy - (src.b / 200);
	var fxcube = Math.pow(fx, 3);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?