Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   RGB <-> HSB (http://www.flasher.ru/forum/showthread.php?t=70209)

artcraft 10.10.2005 03:43

RGB <-> HSB
 
кто знает алгоритм преобразования цвета из RGB в HSB и обратно

hue-цвет(0-360), saturation-насыщенность(0-1), brightness-яркость(0-1)

artcraft 10.10.2005 06:29

вот картинка ;)
http://www.wmich.edu/ppse/IMAGES/p92.jpg

artcraft 10.10.2005 06:40

ccылка по теме http://corfix.use.pl/

iNils 10.10.2005 11:44

Код:

Color.prototype.setHSB = function(colHSB){
        var hue = (colHSB.H == null) ? 0 : (360+colHSB.H)%360;
        var sat = (colHSB.S == null) ? 100 : colHSB.S;
        var bri = (colHSB.B == null) ? 100 : colHSB.B;
        this.setRGB(Color.HSB_to_RGB({H:hue,S:sat,B:bri}));
}

Color.prototype.getHSB = function(){
        return Color.RGB_to_HSB(this.getRGB());
}

Color.RGB_to_HSB = function(colRGB){

        var red = (colRGB&0xFF0000)>>16;
        var gre = (colRGB&0x00FF00)>>8;
        var blu = colRGB&0x0000FF;

        var max = Math.max(red,Math.max(gre,blu));
        var min = Math.min(red,Math.min(gre,blu));

        var colHSB = {}
        colHSB.B = Math.round(max*100/255);

        if(max==min){ // if grey
                colHSB.S = 0;
                colHSB.H = 0;
        }else{
                colHSB.S = Math.round(100*(max-min)/max);
                // find hue
                var hue;
                var tmpR = (max-red)/(max-min);
                var tmpG = (max-gre)/(max-min);
                var tmpB = (max-blu)/(max-min);
                if(red==max){
                        hue = tmpB - tmpG;
                }else if(gre==max){
                        hue = 2 + tmpR - tmpB;
                }else if(blu==max){
                        hue = 4 + tmpG - tmpR;
                }
                colHSB.H = (Math.round(hue*60) + 360)%360;
        }

        return colHSB;

}

Color.HSB_to_RGB = function(colHSB){
        var sat = colHSB.S;
        var bri = colHSB.B;

        var red, gre, blu;
        // if grey don't bother doing any more
        if(sat==0){
                red = bri;
                gre = bri;
                blu = bri;
        }else{

                var hue = (colHSB.H+360)%360;
                var hue2 = Math.floor(hue/60);

                var dif = (hue%60)/60;
                var mid1 = bri*(100-sat*dif)/100;
                var mid2 = bri*(100-sat*(1-dif))/100;
                var min = bri*(100-sat)/100;

                if(hue2 == 0){
                        red = bri;
                        gre = mid2;
                        blu = min;
                }else if(hue2 == 1){
                        red = mid1;
                        gre = bri;
                        blu = min;
                }else if(hue2 == 2){
                        red = min;
                        gre = bri;
                        blu = mid2;
                }else if(hue2 == 3){
                        red = min;
                        gre = mid1;
                        blu = bri;
                }else if(hue2 == 4){
                        red = mid2;
                        gre = min;
                        blu = bri;
                }else{
                        red = bri;
                        gre = min;
                        blu = mid1;
                }
        }
        return (Math.round(red*255/100)<<16 | Math.round(gre*255/100) <<8 | Math.round(blu*255/100));
}


Ion 10.10.2005 18:46

А что делают оператор >> и функция Math.min и Math.max

iNils 10.10.2005 19:00

1. >> бинарный сдвиг влево 4>>1 тоже самое что 4/2, подробности поищи поиском по форуму, недавно рассказывал об этом.
2. Math.max возвращает наибольшее из двух чисел, а Math.min соответсвенно минимальное

artcraft 11.10.2005 18:01

iNils, спасибо тебе


Часовой пояс GMT +4, время: 03:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.