2010-09-16 13 views
8

Konwertuj z koloru kodu HEX na RGB w czysty c używając tylko biblioteki C (bez C++, szablonów itd.) Struktura RGB może być taka -> typedef struct RGB {double r; podwójne g; podwójne b; } RGB1; funkcja powinna zwrócić RGB1Konwertuj z koloru HEX na strukturę RGB w C

+1

Nie jestem pewien, czy rozumiem pytanie. Uważam, że oznaczanie rzeczy jako kodu i/lub wstawianie znaków nowej linii w pytanie w strategicznych miejscach może być pomocne w ułatwianiu ludziom czytania (a zatem i odpowiedzi). – cubic1271

Odpowiedz

8

Wartość RGB może być zapisana jako wartość całkowita przez 0xRRGGBB. Przykłady:

  • Czerwony: 0xFF0000
  • Zielony: 0x00FF00
  • Niebieski: 0x0000FF

00 jest sześciokątny dla dziesiętnych 0, a ff 255 0 odpowiada 0,0 255 do 1,0. (W rzeczywistości nie określiłeś zakresu, zakładam 0,0 do 1,0.)

Tak więc z powyższymi założeniami, musisz wyodrębnić każdy komponent i podzielić przez 255. Ponieważ brzmi to bardzo jak zadanie domowe pytanie, pokażę ci jak możesz zrobić czerwony komponent.

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

Każda cyfra heksagonalna zajmuje 4 bity. Przesunięcie w prawo o 16 bitów (aby przesunąć wszystko o 4 cyfry w prawo), aby 0xRRGGBB stało się 0xRR. Teraz masz czerwony komponent. (Tylko w przypadku, gdy niektóre dane są wyższe w liczbie całkowitej, można się tego pozbyć, maskując dane poprzez & 0xff.)

Jeśli masz do czynienia z ciągiem znaków "#FFFFFF", musisz go najpierw przekonwertować do liczby całkowitej, aby powyższe działało.

14

Zakładając, że wartość hex jest 32-bitowy „int” typ i że używamy struct RGB opisane powyżej, to może zrobić coś takiego:

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

Coś odrywając odpowiedź @konforce, prawda? – ubiquibacon

+0

Nah. Był tam również kod do przetwarzania ciągów, ale punkt, o którym mówiono, był prawdopodobnie dobrym zadaniem domowym. W związku z tym zredagowałem tę odpowiedź tak, aby była bardziej podobna do tej, którą napisałem powyżej. – cubic1271

+0

Należy hexValue być typu unsigned int? Myślę, że & 0xFF anuluje przesunięcie arytmetyczne, ale czy wartość 0xFFFFFF nie spowoduje przepełnienia, gdy zostanie przekazana? –

6

Jeśli kod szesnastkowy jest ciągiem znaków, można analizować go jak ten

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

to wskazówki, a nie podwójne. Sprawdź również, czy sscanf zwraca 3, czyli liczbę odczytanych elementów.

+0

Świetna odpowiedź, prosta i działająca! –

Powiązane problemy