Avatar billede klid Nybegynder
16. november 2007 - 00:14 Der er 7 kommentarer

Sexet kode til at omregne farvenumre fra 10-tal til hex

Hej
Jeg har en kode der spørger til farven i en celle. Den returnere fx "rgb(199,77,214)".

function FindFarve(id){
    var elmt = document.getElementById(id); // Find element
    fv=elmt.style.backgroundColor;  // Finder farven på elementet
return (fv);
}

Nu skal den værdi så sammenlignes med et hexnummer fx #b74cc4
Det skal gøres temmelig mange gange, derfor ville det være rart med en hurtig lille kode uden alt for meget split og spalt.
Avatar billede roenving Novice
16. november 2007 - 00:29 #1
Helt undgås kan det ikke, men kompliceret bliver det heller ikke:

<script type="text/javascript">
var base16 = [0,1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f'];
var x = "rgb(199,77,214)";
x = x.replace(/^rgb\((.*?)\)$/,"$1").split(",");
var newX = "#";
for(i=0;3>i;i++){
  newX += base16[Math.floor(+x[i]/16)] + base16[+x[i]%16];
alert(newX);
</script>

-- og så skal det selvfølgelig sættes ind i en funktion, men det finder du vel nok ud af !-)
Avatar billede klid Nybegynder
16. november 2007 - 00:49 #2
Nu har jeg lavet funktionen. Den virker (næsten), selvom jeg ikke forstår meget af den der replacelinje.


function FindFarve(id){
var base16 = [0,1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f'];
var elmt = document.getElementById(id); // Find element
var x=elmt.style.backgroundColor;  // Finder farven på elementet
    x = x.replace(/^rgb\((.*?)\)$/,"$1").split(",");
    var newX = "#";
    for(i=0;3>i;i++){
      newX += base16[Math.floor(+x[i]/16)] + base16[+x[i]%16];
    }  //for
    alert("x=" + x + " newX=" + newX);
    return(newX);
}//FindFarve

Den retunere 204, 255, 0      #ccff0

Så der mangler lige et ekstra 0, hvis der skal være 6 cifre i hextallet
Avatar billede roenving Novice
16. november 2007 - 01:26 #3
Hrm, den overraskede mig faktisk, men så ved jeg så det, hvis jeg har brug for en lignende funktionalitet en anden gang ...

-- nor man bruger addByValue-operatorer evalueres udtrykket før addByvalue udføres, så base16-tingen skal hedde:

var base16 = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'];

-- en anden ting er, at min test-IE returnerede elementets aktuelle værdi, så hvis jeg havde skrevet background-color:#fc0; havde x værdien "#fc3" eller background-color:#ffcc00; havde x værdien "#ffcc00" og ikke nogen rgb-værdi, skal du tage højde for det, skal vi jo en del længere ud i tolkningen af værdien ,-)
Avatar billede klid Nybegynder
16. november 2007 - 11:44 #4
Det virker med den sidste rettelse. Det sidste med at benytte hex farvekoder med mindre end 6 decimaler gør jeg bare ikke.
Jeg bruger FF - er 2+2 ikke det samme i IE og FF?

Smid et svar
Avatar billede montago Praktikant
16. november 2007 - 15:53 #5
hmm.... konverteringen tager for lang tid hvis der er tale om en animation...

hvis koden skal være super duper optimal, skal du lave en hash tabel på 256 entiteter for alle hex combos:

int2hex8bit = [
  "1":"01", "2":"02", "3":"03", "4":"04", ....osv
  "254":"FE", "255":"FF"
]

da' vil du mærke en væsentlig hastigheds forøgelse

evt ville jeg gøre følgende:

var str = "rgb(199,77,214)"
var color = str.replace(/rgb\((\d+),(\d+),(\d+)\)/, function($1,$2,$3){
    return "#" + int2hex8bit[$1] + int2hex8bit[$2] + int2hex8bit[$3]
});

super duper sexet ;) -- og hurtig
Avatar billede klid Nybegynder
16. november 2007 - 22:11 #6
Nu  er det min tur til at sige Hmmmrf
Det er pisseiriterende at jeg ikke helt forstår hvad der foregår, for jeg er så nær på og dog så langt fra. Jeg vil jo så gerne være bare en lille smule sexet.

Den kode montago forslog med "1":"01" osv, fik en fejlmeddelse på ':'. Den forventede en ']'.

Nu har jeg så lavet den enklet som et array. Tilbage står så blot at få de tre tal ud af RGB koden. Og her forstår jeg ikke den der sexede ting du har lavet.
Har prøvet forskellige ting, men som den står lige nu får jeg en fejl på '\' lige efter rgb.

Her er koden i sin nuværende form.

function FindFarve(id){
var int2hex8bit = ["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"];
var elmt = document.getElementById(id); // Find element
var str=elmt.style.backgroundColor;  // Finder farven på elementet
//var color = str.replace(/^rgb\((.*?)\)$/,"$1").split(",");
//var farv="#"+ int2hex8bit[$1] + int2hex8bit[$2] + int2hex8bit[$3];
var color = str.replace(/rgb\((\d+),(\d+),(\d+)\)\,function($1,$2,$3){
    return "#" + int2hex8bit[$1] + int2hex8bit[$2] + int2hex8bit[$3];
});
//alert("color=" + color + " $1=" + $1);
//alert("str=" + str + " color=" + color+ "farv=" + farv);

}//FindFarve


Egentligt troede jeg at det var "dyrt" i CPU energi at bruge arrays.
Avatar billede klid Nybegynder
18. november 2007 - 17:57 #7
Aaaaeee
Jeg fandt på at gøre det hele omvendt. At oversætte de relativt begrænsede farver jeg bruger til rgb kode og så bare sammenligne dem direkte. Lidt besværligt hvis man vil ændre farverne, men meget resourcebesparende i sammenligningerne.

var samdob="#009911";
var dc="995599";
var dd="#7700dd";
var hd="#ef0000";
var cc1="#0044fd";
var cc2="#0090ef";

var samdob10='rgb(0, 153, 17)';
var dc10='rgb(153, 85, 153)';
var dd10='rgb(119, 0, 221)';
var hd10='rgb(239, 0, 0)';
var cc110='rgb(0, 68, 253)';
var cc210='rgb(0, 144, 239)';

Men I skal da have lidt for jeres ulejlighed og inspiration, jeg tænker at dele pointene. RW - hvis du vil have dem skal du jo lige smide et svar

hej klid


Så har jeg dem på såvel den ene som den anden form, og kan blot spørge om fv==fv10
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester