颜色计算(颜色的加减混合、比较):
/**
*
* *-----------------------------------------*
* | *** 颜色计算(颜色的加减混合、比较) *** |
* *-----------------------------------------*
*
* 编辑修改收录:fengzi(疯子、wu341、wgq341)
*
* 不会写代码,我是代码搬运工。
*
* 联系方式:QQ(493712833)。
*
* 随 笔: https://www.cnblogs.com/fengziwu/
*
* 版权协议:请自觉遵守LGPL协议,欢迎修改、复制、转载、传播给更多需要的人。
* 免责声明:任何因使用此软件导致的纠纷与软件/程序开发者无关。
* 日 期: 2019.05.08
*/
package fengzi.colors
{
public class ColorMath
{
/**
* 减法
* 返回从两个RGB的数值(0x000000~0xFFFFFF)减去的数值。
* 如果将指示ARGB的数值传送给参数,则将忽略α值。
* @param col1 表示RGB的数值(0x000000~0xFFFFFF)
* @param col2 表示RGB的数值(0x000000~0xFFFFFF)
* @return 减法混合值
* trace( ColorMath.subtract( 0xFFFF00 , 0x666666 ).toString(16) );//输出: 656500
*/
public static function subtract( col1:Number , col2:Number ):Number
{
var a = toRGB(col1);
var b = toRGB(col2);
var nr = Math.max(Math.max(b[0] - (256 - a[0]),a[0] - (256 - b[0])),0);
var ng = Math.max(Math.max(b[1] - (256 - a[1]),a[1] - (256 - b[1])),0);
var nb = Math.max(Math.max(b[2] - (256 - a[2]),a[2] - (256 - b[2])),0);
return toDec( nr , ng , nb );
}
/**
* 加法混合色
* 返回从两个RGB的数值(0x000000~0xFFFFFF)到加法混合的数值。
* 如果将指示ARGB的数值传送给参数,则将忽略α值。
* @param col1 表示RGB的数值(0x000000~0xFFFFFF)
* @param col2 表示RGB的数值(0x000000~0xFFFFFF)
* @return 加法混合值
* trace( ColorMath.sum( 0xFFFF00 , 0x666666 ).toString(16) );//输出: ffff66
*/
public static function sum( col1:Number , col2:Number ):Number
{
var a = toRGB(col1);
var b = toRGB(col2);
var nr = Math.min(a[0] + b[0],255);
var ng = Math.min(a[1] + b[1],255);
var nb = Math.min(a[2] + b[2],255);
return toDec( nr , ng , nb );
}
/**
* 減法混色
* 返回从两个RGB的数值(0x000000~0xFFFFFF)到减法混合的数值。
* 如果将指示ARGB的数值传送给参数,则将忽略α值。
*
* @param col1 表示RGB的数值(0x000000~0xFFFFFF)
* @param col2 表示RGB的数值(0x000000~0xFFFFFF)
* @return 减法混色値
*
* trace( ColorMath.sub( 0xFFFF00 , 0x666666 ).toString(16) ); // 出力 : 999900
*
*/
public static function sub( col1:Number , col2:Number ):Number
{
var a = toRGB(col1);
var b = toRGB(col2);
var nr = Math.max(a[0] - b[0],0);
var ng = Math.max(a[1] - b[1],0);
var nb = Math.max(a[2] - b[2],0);
return toDec( nr , ng , nb );
}
/**
* 比较(黑暗)
* 从两个RGB的数值(0x000000~0xFFFFFF)比较,返回RGB各自数值较低的数值。
* 如果将指示ARGB的数值传送给参数,则将忽略α值。
*
* @param col1 表示RGB的数值(0x000000~0xFFFFFF)
* @param col2 表示RGB的数值(0x000000~0xFFFFFF)
* @return 比较(暗)值
*
* trace( ColorMath.min( 0xFFFF00 , 0x666666 ).toString(16) ); // 出力 : 666600
*
*/
public static function min( col1:Number , col2:Number ):Number
{
var a = toRGB(col1);
var b = toRGB(col2);
var r = Math.min(a[0],b[0]);
var g = Math.min(a[1],b[1]);
var b = Math.min(a[2],b[2]);
return toDec( r , g , b );
}
/**
* 比较(明)
* 从两个RGB的数值(0x000000~0xFFFF F)比较,返回RGB分别以高数值计算的数值。
* 如果将指示ARGB的数值传送给参数,则将忽略α值。
*
* @param col1 表示RGB的数值(0x000000~0xFFFFFF)
* @param col2 表示RGB的数值(0x000000~0xFFFFFF)
* @return 比较(明)值
* >
* trace( ColorMath.max( 0xFFFF00 , 0x666666 ).toString(16) ); // 出力 : ffff66
*
*/
public static function max( col1:Number , col2:Number ):Number
{
var a = toRGB(col1);
var b = toRGB(col2);
var r = Math.max(a[0],b[0]);
var g = Math.max(a[1],b[1]);
var b = Math.max(a[2],b[2]);
return toDec( r , g , b );
}
/**
* 各颜色值的排列
* @param col 表示ARGB的数值(0x00000000到0xFFFFFFFF)
* @return Array 表示各颜色值的排列[ R , G , B , Alpha ]
*
* trace( ColorMath.toRGB( 0xFF33699 ) );//输出: 51,102,153,255
*
*/
public static function toRGB( col:Number ):Array
{
if (typeof(col)=="number")
{
var a = Math.floor(col/16777216);
var r = Math.floor((col-a*16777216)/65536);
var g = Math.floor((col-(a*16777216+r*65536))/256);
var b = Math.floor((col-(a*16777216+r*65536+g*256)));
return [r,g,b,a];
}
}
/**
* 颜色值获得的ARGB的数字
* 如果将指示ARGB的数值传送给参数,则将忽略α值。
*
* @param r 红
* @param g 绿
* @param b 蓝
* @param a 透明度
* @return 从每个颜色值获得的ARGB的数字
*
* trace( ColorMath.toDec( 51, 102 , 153, 255 ) ); // 出力 : 4281558681
*
*/
public static function toDec( r:Number , g:Number , b:Number , a:Number ):Number
{
if (a)
{
return Math.floor(a)*16777216+Math.floor(r)*65536+Math.floor(g)*256+Math.floor(b);
}
return Math.floor(r)*65536+Math.floor(g)*256+Math.floor(b);
}
/**
* RGB转换为HSV(HSB)的数组。
* @param r 红
* @param g 绿
* @param b 蓝
* @return Array HSV[ H, S, V ]
*
* var rgb = ColorMath.toRGB( 0xFF6600 );
* trace( ColorMath.convertHSV.apply( null , rgb ) ); // 出力 : 24,100,50
*
*/
public static function convertHSV( r:Number, g:Number, b:Number ):Array
{
r /= 255;
g /= 255;
b /= 255;
var h = 0,s = 0,v = 0;
var x,y;
if (r>=g)
{
x = r;
}
else
{
x = g;
}
if (b>x)
{
x = b;
}
if (r<=g)
{
y = r;
}
else
{
y = g;
}
if (b<y)
{
y = b;
}
v = x;
var c = x - y;
if (x==0)
{
s = 0;
}
else
{
s = c / x;
}
if (s!=0)
{
if (r==x)
{
h = (g - b) / c;
}
else
{
if (g==x)
{
h = 2 + (b - r) / c;
}
else
{
if (b==x)
{
h = 4 + (r - g) / c;
}
}
}
h = h * 60;
if (h<0)
{
h = h + 360;
}
}
return [ h, s*100, v*100 ];
}
/**
* HSV(HSB)转RGB[r,g,b]
*
* @param h 色相(Hue 0-360)
* @param s 彩度(Saturation 0-360)
* @param v 明度(Value 0-360)
* @return Array RGB[ R, G, B ]
*
* trace( ColorMath.convertRGB( 24, 100, 50 ) ); // 出力 : 255,102,0
*
*/
public static function convertRGB( h:Number, s:Number, v:Number ):Array
{
s = s / 100,v = v / 100;
var r = 0,g = 0,b = 0;
var i,x,y,z;
if (s<0)
{
s = 0;
}
if (s>1)
{
s = 1;
}
if (v<0)
{
v = 0;
}
if (v>1)
{
v = 1;
}
h = h % 360;
if (h<0)
{
h += 360;
}
h /= 60;
i = Math.floor(h);
x = v * (1 - s);
y = v * (1 - s * (h - i));
z=v*(1-s*(1-h+i));
switch (i)
{
case 0 :
r = v;
g = z;
b = x;
break;
case 1 :
r = y;
g = v;
b = x;
break;
case 2 :
r = x;
g = v;
b = z;
break;
case 3 :
r = x;
g = y;
b = v;
break;
case 4 :
r = z;
g = x;
b = v;
break;
case 5 :
r = v;
g = x;
b = y;
break;
}
return [ r*255, g*255, b*255 ];
}
}
}
浙公网安备 33010602011771号