2010-09-16 12 views
8

Sadece C kütüphanesi kullanılarak (C++, şablonlar, vb. Olmadan) renkli HEX kodunu RGB'ye dönüştürün RGB yapısı şöyle olabilir:> typedef struct RGB {double r; çift ​​g; çift ​​b; RGB1; işlevi, RGB1HEX renginden RGB yapısına dönüştürün C

+1

Soruyu anladığımdan emin değilim. Soruları kod olarak işaretlemenin ve/veya stratejik yerlerin içine yeni satırlar eklemenin insanların sorularının daha kolay okunmasında (ve dolayısıyla cevaplanmasında) yardımcı olabileceğine inanıyorum. – cubic1271

cevap

8

işlevini döndürmelidir. RGB değeri 0xRRGGBB aracılığıyla tamsayı olarak kaydedilebilir. Örnekler:

  • Kırmızı: 0xFF0000
  • Yeşil: 0x00ff00
  • Mavi: ff 255. 0 0.0 ile 1.0 ve 255 tekabül ise

00 heks, ondalık 0 olduğu 0x0000FF. (Aslında aralığın ne olduğunu belirtmediniz. 0.0 ile 1.0 arasında bir değer olduğunu varsayalım.)

Yukarıdaki varsayımlarla birlikte, her bir bileşeni ayıklayıp 255'e bölünmeniz gerekir. soru, size sadece kırmızı bileşeni nasıl yapabileceğinizi göstereceğim.

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

Her onaltılı basamak 4 bit alır. Böylece 0xRRGGBB'u 0xRR haline getirmek için sağa 16 bit (4 haneyi sağa hareket ettirmek için) kaydırın. Şimdi kırmızı bileşen var. (Sadece tamsayıda daha yüksek bir veri olması durumunda, verileri & 0xff aracılığıyla maskeleyerek kurtulursunuz.)

"#FFFFFF" dizgisiyle ilgileniyorsanız, önce onu dönüştürmeniz gerekir. Yukarıdakilerin çalışması için bir tamsayıya.

14

sizin onaltılık değeri 32 bit 'int' türü olduğunu varsayarsak, ve biz RGB yapı yukarıda açıklanan kullandıkları zaman belki böyle bir şey yapmak:

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

Cevap @konforce verdiğimiz cevap vermiyor değil mi? – ubiquibacon

+0

Nah. Dize işlemede de orada kod vardı, ama bu konuda yapılmış bir not niteliği muhtemelen bir ev ödevi sorusuydu. Böylece, bu cevabı yukarıda yayınlanan bir konya benzetmek için düzenledim. – cubic1271

+0

hexValue unsigned int türünde olmalıdır? Sanırım & 0xFF, aritmetik kaydırmayı iptal eder, ancak 0xFFFFFF değeri, aktarıldığında taşmaya neden olmaz mı? –

6

, sen ints, değil çiftler için bu

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

gibi ayrıştırma yapabilir. Ayrıca sscanf öğesinin 3, okunan öğe sayısını döndürdüğünü kontrol edin.

+0

Harika cevap, basit ve çalışıyor! –

İlgili konular