颜色计算(颜色的加减混合、比较):
/** * * *-----------------------------------------* * | *** 颜色计算(颜色的加减混合、比较) *** | * *-----------------------------------------* * * 编辑修改收录: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 ]; } } }