Из 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, время: 13:34. |