2010-09-16 14 views
8

Konvertieren von Farbe HEX-Code in RGB in reinem c nur mit C-Bibliothek (ohne C++, Vorlagen, etc.) RGB-Struktur kann so sein -> typedef struct RGB {double r; Doppel-g; doppeltes b; } RGB1; Funktion sollte RGB1 zurückgebenKonvertieren von HEX-Farbe in RGB-Struktur in C

+1

Ich bin mir nicht sicher, ob ich die Frage verstehe. Ich glaube, dass das Markieren von Dingen als Code und/oder Einfügen von Zeilenumbrüchen in die Frage an strategischen Orten hilfreich sein kann, um die Frage für die Leser leichter zu machen (und daher zu antworten). – cubic1271

Antwort

8

Ein RGB-Wert kann als Integer über 0xRRGGBB gespeichert werden. Beispiele:

  • Rot: 0xff0000
  • Grün: 0x00FF00
  • Blau: 0x0000ff

00 ist hex für dezimal 0, während ff 255 0 entspricht 0,0 und 255 bis 1,0 liegt. (Eigentlich haben Sie nicht angegeben, was der Bereich ist. Ich gehe von 0.0 bis 1.0.)

Also mit den obigen Annahmen, müssen Sie jede Komponente extrahieren und durch 255 dividieren. Da klingt es viel wie eine Hausaufgabe Frage, ich zeige dir nur, wie du die rote Komponente machen kannst.

int hex = 0x123456; 
c.r = ((hex >> 16) & 0xff)/255.0; 

Jede Hexadezimalstelle belegt 4 Bit. Also nach rechts um 16 Bits verschieben (um alle 4 Ziffern nach rechts zu verschieben), um aus 0xRRGGBB0xRR zu werden. Jetzt haben Sie die rote Komponente. (Nur für den Fall, dass einige Daten höher in der Ganzzahl sind, können Sie sie loswerden, indem Sie die Daten über & 0xff maskieren.)

Wenn Sie mit einer Zeichenfolge "#FFFFFF" umgehen, dann müssen Sie es zuerst konvertieren zu einer Ganzzahl für das oben genannte zu arbeiten.

14

Unter der Annahme, dass Ihr Hex-Wert ist ein 32-Bit ‚int‘ Typ, und dass wir die RGB-Struktur verwenden oben beschrieben, dann vielleicht so etwas wie:

struct RGB colorConverter(int hexValue) 
{ 
    struct RGB rgbColor; 
    rgbColor.r = ((hexValue >> 16) & 0xFF)/255.0; // Extract the RR byte 
    rgbColor.g = ((hexValue >> 8) & 0xFF)/255.0; // Extract the GG byte 
    rgbColor.b = ((hexValue) & 0xFF)/255.0;  // Extract the BB byte 

    return rgbColor; 
} 
+0

Art der Ripping die Antwort @konforce gab, sind wir nicht? – ubiquibacon

+0

Nein. Es gab auch Code für die String-Verarbeitung, aber der Punkt, an dem Conforce wahrscheinlich eine Hausaufgabe war, war gut. Daher habe ich diese Antwort so bearbeitet, dass sie eher der oben angegebenen Kon-Nummer entspricht. – cubic1271

+0

Sollte hexValue vom Typ unsigned int sein? Ich denke, dass & 0xFF die arithmetische Verschiebung aufhebt, aber würde ein Wert wie 0xFFFFFF keinen Überlauf verursachen, wenn er übergeben wird? –

6

Wenn der Hex-Code ein String ist, können Sie es wie folgt

char *str = "0000FF"; 
int r, g, b; 
sscanf(str, "%02x%02x%02x", &r, &g, &b); 

analysieren, die zu ints ist, nicht verdoppelt. Überprüfen Sie auch, dass sscanf 3 gibt, die Anzahl der gelesenen Elemente.

+0

Große Antwort, einfach und funktioniert! –