//hex颜色转rgb颜色 export function HexToRgb(str) { var r = /^\#?[0-9A-Fa-f]{6}$/; //test方法检查在字符串中是否存在一个模式,如果存在则返回true,否则返回false if (!r.test(str)) return window.alert("输入错误的hex"); //replace替换查找的到的字符串 str = str.replace("#", ""); //match得到查询数组 var hxs = str.match(/../g); //alert('bf:'+hxs) for (var i = 0; i < 3; i++) hxs[i] = parseInt(hxs[i], 16); //alert(parseInt(80, 16)) return hxs; } //GRB颜色转Hex颜色 export function RgbToHex(a, b, c) { var r = /^\d{1,3}$/; if (!r.test(a) || !r.test(b) || !r.test(c)) return '#ffffff'; var hexs = [a.toString(16), b.toString(16), c.toString(16)]; for (var i = 0; i < 3; i++) if (hexs[i].length == 1) hexs[i] = "0" + hexs[i]; return "#" + hexs.join(""); } //得到hex颜色值为color的加深颜色值,level为加深的程度,限0-1之间 export function getDarkColor(color, level) { var r = /^\#?[0-9A-Fa-f]{6}$/; if (!r.test(color)) return color; var rgbc = HexToRgb(color); //floor 向下取整 for (var i = 0; i < 3; i++) rgbc[i] = Math.floor(rgbc[i] * (1 - level)); return RgbToHex(rgbc[0], rgbc[1], rgbc[2]); } //得到hex颜色值为color的减淡颜色值,level为加深的程度,限0-1之间 export function getLightColor(color, level) { var r = /^\#?[0-9A-Fa-f]{6}$/; if (!r.test(color)) return color; var rgbc = HexToRgb(color); for (var i = 0; i < 3; i++) rgbc[i] = Math.floor((255 - rgbc[i]) * level + rgbc[i]); return RgbToHex(rgbc[0], rgbc[1], rgbc[2]); } export const HexStringToKeywords = { '#ff0000': '红', '#ffff00': '黄', '#00ff00': '绿', '#00ffff': '青', '#0000ff': '蓝', '#ff00ff': '洋红', '#ffffff': '白', '#808080': '深灰', '#c0c0c0': '浅灰', } export const HexStringToRGBString = (value) => { let m = /^\#([A-Fa-f\d]+)$/.exec( value ); const hex = m[ 1 ]; const size = hex.length; if ( size === 3 ) { // #ff0 let r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ); let g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ); let b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ); return `${r},${g},${b}`; } else if ( size === 6 ) { // #ff0000 let r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ); let g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ); let b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ); return `${r},${g},${b}`; } else { let r = -1; let g = -1; let b = -1; return `${r},${g},${b}`; } } export const HexStringToRGB = (value) => { let m = /^\#([A-Fa-f\d]+)$/.exec( value ); const hex = m[ 1 ]; const size = hex.length; if ( size === 3 ) { // #ff0 let r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ); let g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ); let b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ); return {r, g, b, a: 1.0}; } else if ( size === 6 ) { // #ff0000 let r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ); let g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ); let b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ); return {r, g, b, a: 1.0}; }else { let r = -1; let g = -1; let b = -1; return {r, g, b, a: 1.0}; } } export const HexToRGB = (value) => { let hex = Math.floor( value ); let r = ( hex >> 16 & 255 ) / 255; let g = ( hex >> 8 & 255 ) / 255; let b = ( hex & 255 ) / 255; return {r,g,b, a: 1.0}; } export const RGBToHex = (value) => { return ( value.r ) << 16 ^ ( value.g ) << 8 ^ ( value.b ) << 0; } export const RGBToHexString = (value) => { let res = ( '000000' + RGBToHex(value).toString( 16 ) ).slice( - 6 ); return `#${res}`; } export const HSVToRGB = (value) => { var h = value.h, s = value.s, v = value.v; // s = s / 100; // v = v / 100; var r = 0, g = 0, b = 0; var i = Math.floor((h / 60) % 6); var f = h / 60 - i; var p = v * (1 - s); var q = v * (1 - f * s); var t = v * (1 - (1 - f) * s); switch (i) { case 0: r = v; g = t; b = p; break; case 1: r = q; g = v; b = p; break; case 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; case 4: r = t; g = p; b = v; break; case 5: r = v; g = p; b = q; break; default: break; } r = Math.round(r * 255.0) g = Math.round(g * 255.0) b = Math.round(b * 255.0) return {r, g, b, a: value.a}; } export const RGBToHSV = (value) => { var h = 0, s = 0, v = 0; var r = value.r, g = value.g, b = value.b; var max = Math.max(r, g, b); var min = Math.min(r, g, b); v = max / 255; if (max === 0) { s = 0; } else { s = 1 - (min / max); } if (max === min) { h = 0; } else if (max === r && g >= b) { h = 60 * ((g - b) / (max - min)) + 0; } else if (max === r && g < b) { h = 60 * ((g - b) / (max - min)) + 360 } else if (max === g) { h = 60 * ((b - r) / (max - min)) + 120 } else if (max === b) { h = 60 * ((r - g) / (max - min)) + 240 } h = Math.round(h * 100) / 100; s = Math.round(s * 100) / 100; v = Math.round(v * 100) / 100; return {h, s, v, a: value.a} } export const RGBToHSL = (value) => { const r = value.r/255, g = value.g/255, b = value.b/255; const max = Math.max( r, g, b ); const min = Math.min( r, g, b ); let hue, saturation; const lightness = ( min + max ) / 2.0; if ( min === max ) { hue = 0; saturation = 0; } else { const delta = max - min; saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); switch ( max ) { case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; case g: hue = ( b - r ) / delta + 2; break; case b: hue = ( r - g ) / delta + 4; break; } hue /= 6; } return {h: hue*360, s: saturation, l: lightness, a: value.a}; } function clamp( value, min, max ) { return Math.max( min, Math.min( max, value ) ); } // compute euclidian modulo of m % n // https://en.wikipedia.org/wiki/Modulo_operation function euclideanModulo( n, m ) { return ( ( n % m ) + m ) % m; } export const HSLToRGB = (value) => { // h,s,l ranges are in 0.0 - 1.0 let h = euclideanModulo( value.h/360, 1 ); let s = clamp( value.s, 0, 1 ); let l = clamp( value.l, 0, 1 ); var r, g, b; if ( s === 0 ) { r = g = b = l; } else { const p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); const q = ( 2 * l ) - p; r = hue2rgb( q, p, h + 1 / 3 ); g = hue2rgb( q, p, h ); b = hue2rgb( q, p, h - 1 / 3 ); } return {r, g, b, a:1.0} } function hue2rgb( p, q, t ) { if ( t < 0 ) t += 1; if ( t > 1 ) t -= 1; if ( t < 1 / 6 ) return Math.round((p + ( q - p ) * 6 * t)*255); if ( t < 1 / 2 ) return Math.round(q*255); if ( t < 2 / 3 ) return Math.round((p + ( q - p ) * 6 * ( 2 / 3 - t ))*255); return Math.round(p * 255); }