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
Antwort
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 0xRRGGBB
0xRR
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.
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;
}
Art der Ripping die Antwort @konforce gab, sind wir nicht? – ubiquibacon
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
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? –
denke, ich RGB als 0xRRGGBB gespeichert werden könnte auf einigen Systemen, aber in Windows wird es tatsächlich als 0xBBGGRR gespeichert (siehe http://msdn.microsoft.com/en-us/library/windows/desktop/dd183449). Wie im Artikel erwähnt, gibt es bereits die Makros GetRValue, GetGValue und GetBValue.
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.
Große Antwort, einfach und funktioniert! –
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