Из RGB в HSB
Не могу найти работающее решение, они все не на JS, так что я переписывал функции.
Попробовал это function RGBtoHSB(RGB_r, RGB_g, RGB_b){ var Min, Max, D, H; Max = (RGB_r > RGB_g) ? ((RGB_r > RGB_b) ? RGB_r : RGB_b) : ((RGB_g > RGB_b) ? RGB_g : RGB_b); Min = (RGB_r < RGB_g) ? ((RGB_r < RGB_b) ? RGB_r : RGB_b) : ((RGB_g < RGB_b) ? RGB_g : RGB_b); if(Min == Max) { HSB_h = 0; HSB_s = 0; HSB_b = Max / 255; } else { if(RGB_r == Min) { D = RGB_g - RGB_b; H = 3; } else { if(RGB_g == Min) { D = RGB_b - RGB_r; H = 5; } else { D = RGB_r - RGB_g; H = 1; } } HSB_h = (H - (D / (Max - Min))) / 6; HSB_s = (Max - Min) / Max; HSB_b = Max / 255; } HSB_h = HSB_h * 360; if(HSB_h == 360) { HSB_h = 0; } HSB_h *= 100; HSB_s *= 100; HSB_b *= 100; alert(HSB_h + ' - ' + HSB_s + ' - ' + HSB_b); } RGBtoHSB(127, 212, 255); И это function max(a, b){ return a > b ? a : b; } function min(a, b){ return a < b ? a : b; } function RGBtoHSB(RGB_r, RGB_g, RGB_b){ var HSB_h, HSB_s, HSB_b; var r = RGB_r / 255.0; var g = RGB_g / 255.0; var b = RGB_b / 255.0; var maxf = max(max(r, g), b); var minf = min(min(r, g), b); var delta = maxf - minf; if (delta != 0){ var hue; if (r == maxf){ hue = (g - b) / delta; }else{ if (g == maxf){ hue = 2 + (b - r) / delta; }else{ hue = 4 + (r - g) / delta; } } hue *= 60; if (hue < 0){ hue += 360; } HSB_h = hue; }else{ HSB_h = 0; } HSB_s = maxf == 0 ? 0 : (maxf - minf) / maxf; HSB_b = maxf; alert(HSB_h + ' - ' + HSB_s + ' - ' + HSB_b); } RGBtoHSB(127, 212, 255); И ещё решений 5-7 из разных источников, все не работает. Подскажите, где ошибка в этом коде? |
ВэйДлин,
а какой результат должен быть RGBtoHSB(127, 212, 255); |
Вложений: 1
200, 50, 100
|
ВэйДлин,
с инета function rgb2hsv(d, e, f) { var h, b; d /= 255; e /= 255; var g = f / 255, a, k, c = Math.max(d, e, g); b = c - Math.min(d, e, g); 0 == b ? a = k = 0 : (k = b / c, f = (c - d) / 6 / b + .5, h = (c - e) / 6 / b + .5, b = (c - g) / 6 / b + .5, d === c ? a = b - h : e === c ? a = 1 / 3 + f - b : g === c && (a = 2 / 3 + h - f), 0 > a ? a += 1 : 1 < a && --a); return [Math.round(360 * a), Math.round(100 * k), Math.round(100 * c)] }; alert( rgb2hsv(127, 212, 255) ); |
ВэйДлин,
да и ваш код вполне рабочий с поправкой function RGBtoHSB(RGB_r, RGB_g, RGB_b){ var Min, Max, D, H; Max = (RGB_r > RGB_g) ? ((RGB_r > RGB_b) ? RGB_r : RGB_b) : ((RGB_g > RGB_b) ? RGB_g : RGB_b); Min = (RGB_r < RGB_g) ? ((RGB_r < RGB_b) ? RGB_r : RGB_b) : ((RGB_g < RGB_b) ? RGB_g : RGB_b); if(Min == Max) { HSB_h = 0; HSB_s = 0; HSB_b = Max / 255; } else { if(RGB_r == Min) { D = RGB_g - RGB_b; H = 3; } else { if(RGB_g == Min) { D = RGB_b - RGB_r; H = 5; } else { D = RGB_r - RGB_g; H = 1; } } HSB_h = (H - (D / (Max - Min))) / 6; HSB_s = (Max - Min) / Max; HSB_b = Max / 255; } HSB_h = HSB_h * 360; if(HSB_h == 360) { HSB_h = 0; } //HSB_h *= 100; HSB_s *= 100; HSB_b *= 100; alert(Math.round(HSB_h) + ' - ' + Math.round(HSB_s) + ' - ' +Math.round( HSB_b)); } RGBtoHSB(127, 212, 255); |
Откудыть вообще этот код, написанный наркоманами не знающими о базовых математических функциях js типа Math.min\max?
|
Часовой пояс GMT +3, время: 22:37. |