2013-01-17 16 views
7

C++ uygulamasında, Kırmızı, Yeşil, Mavi değerler açısından bir png görüntüsünün rengine sahibim. Bu değerleri üç tam sayı içinde sakladım.RGB renk değerini C++ 'da onaltılık bir değere nasıl dönüştürür?

RGB değerleri eşdeğer onaltılık değere nasıl dönüştürülür? Bu biçimde 0x1906

EDIT gibi bunun

Örnek: GLuint olarak formatını kaydeder. Eğer bir dize oluşturmak istiyorsanız

+1

Bu sayı, '0x1906', hangi bitler farklı renkleri temsil eder? –

+0

Bundan emin değilim. Ama RGB dizisi gibi olmalı! Sorunuzu cevaplarsa bilmiyorum. Afedersiniz! – Tahlil

+0

Bekleyin, bazı biçimlere dönüştürmek istiyorsunuz, ancak bu biçimin ne olduğunu bilmiyorsunuz? Bu sorunu çözmenin tek bir yolu var ve hiç kimse size bu konuda yardımcı olamaz. –

cevap

17

Store (bir long gibi) en az 24 bit işaretsiz tamsayı, her rengin uygun bitleri:

unsigned long createRGB(int r, int g, int b) 
{ 
    return ((r & 0xff) << 16) + ((g & 0xff) << 8) + (b & 0xff); 
} 

Şimdi yerine:

unsigned long rgb = 0xFA09CA; 

Yapabileceğiniz:

unsigned long rgb = createRGB(0xFA, 0x09, 0xCA); 

Yukarıdakilerin alfa kanalıyla ilgilenmeyeceğini unutmayın. Ayrıca (RGBA) alfa kodlamak gerekiyorsa, o zaman bu yerine gerekir: bu İhtiyacınız buysa

unsigned long createRGBA(int r, int g, int b, int a) 
{ 
    return ((r & 0xff) << 24) + ((g & 0xff) << 16) + ((b & 0xff) << 8) 
      + (a & 0xff); 
} 

GLuint ile unsigned long değiştirin.

7

, muhtemelen snprintf() kullanabilirsiniz:

const unsigned red = 0, green = 0x19, blue = 0x06; 
char hexcol[16]; 

snprintf(hexcol, sizeof hexcol, "%02x%02x%02x", red, green, blue); 

Bu sadece dört basamaktır senin örneğin rengini (yorumlamak seçti nasıl dize 001906" in hexcol`, inşa edecek Altı olması gerektiğinde).

GL_ALPHA önişlemci sembolünün OpenGL'nin üstbilgi dosyalarında 0x1906 olarak tanımlanmış olması gerçeğiyle karıştırılmış görünüyorsunuz. Bu bir renk değil, piksellerle ilgilenen OpenGL API çağrılarıyla kullanılan biçim belirteci, dolayısıyla hangi biçimin beklendiğini biliyorlar. Eğer bellekte bir PNG resim varsa

, GL_ALPHA biçimi, yukarıda bir dize oluşturur çünkü tamamen farklı bir şeydir (varsa) görüntüdeki sadece alfa değerleri karşılık olur. OpenGL bir dizeye gerek duymaz, verileri gereken biçimde tutan bir bellek içi arabelleğe ihtiyaç duyar.

Bunun nasıl çalıştığıyla ilgili bir tartışma için glTexImage2D() elkitabı sayfasına bakın.

+0

Sorunumu tam olarak doğru anladın. Burada sıkışıp kaldım. Bir png görüntüsünün PLTE yığınından aldığım rgb değerlerine sahibim. Doku formatını ayarlamak istiyorum. Ancak görüntünün renk türü, indekslenmiş bir renktir. Normalde 0 (PNG_COLOR_TYPE_GRAY) gibi diğer renk türleri için doku formatını 0x1909 olarak ayarladım (GL_LUMINANCE). Peki renk 3 için ne yapmalıyım? Bu konuda bir yazı yazdım http://stackoverflow.com/questions/14373099/png-image-texture-format-for-color-type-3 – Tahlil

İlgili konular