2013-01-17 65 views
7

Trong ứng dụng C++ của tôi, tôi có màu của hình ảnh png về các giá trị Red, Green, Blue. Tôi đã lưu trữ các giá trị này trong ba số nguyên.cách chuyển đổi giá trị màu RGB thành giá trị thập lục phân trong C++?

Làm cách nào để chuyển đổi giá trị RGB thành giá trị thập lục phân tương đương?

Ví dụ về điều đó như thế nào trong định dạng này 0x1906

EDIT: Tôi sẽ tiết kiệm được định dạng như GLuint.

+1

Trong số đó, '0x1906', bit nào đại diện cho các màu khác nhau? –

+0

Tôi không chắc chắn về điều đó. Nhưng nó phải giống như trình tự RGB! Không biết nếu nó trả lời câu hỏi của bạn. Lấy làm tiếc! – Tahlil

+0

Chờ, bạn muốn chuyển đổi sang một số định dạng nhưng bạn không biết định dạng đó là gì? Chỉ có một cách để giải quyết vấn đề đó, và không ai có thể thực sự giúp bạn với điều đó. –

Trả lời

17

Store bit thích hợp của mỗi màu sang integer unsigned của ít nhất 24 bit (như một long):

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

Bây giờ thay vì:

unsigned long rgb = 0xFA09CA; 

bạn có thể làm:

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

Lưu ý rằng ở trên sẽ không xử lý kênh alpha. Nếu bạn cũng cần phải mã hóa alpha (RGBA), sau đó bạn cần điều này thay vì:

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

Thay unsigned long với GLuint nếu đó là những gì bạn cần.

7

Nếu bạn muốn xây dựng một chuỗi, bạn có thể có thể sử dụng snprintf():

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

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

này sẽ xây dựng hexcol` chuỗi 001906" in, đó là cách tôi đã chọn để giải thích màu sắc dụ của bạn (đó là chỉ có bốn chữ số khi nó phải là sáu).

Bạn dường như bị nhầm lẫn với thực tế là biểu tượng tiền xử lý GL_ALPHA được xác định là 0x1906 trong các tệp tiêu đề của OpenGL. Đây không phải là màu, đó là một định dạng số định dạng được sử dụng với các cuộc gọi API OpenGL xử lý pixel, để họ biết định dạng mong đợi.

Nếu bạn có hình ảnh PNG trong bộ nhớ, định dạng GL_ALPHA sẽ tương ứng với chỉ giá trị alpha trong hình ảnh (nếu có), ở trên là một điều hoàn toàn khác. OpenGL sẽ không cần một chuỗi, nó sẽ cần một bộ đệm trong bộ nhớ giữ dữ liệu theo định dạng yêu cầu.

Xem trang hướng dẫn sử dụng glTexImage2D() để biết cách hoạt động của tính năng này.

+0

Bạn gặp vấn đề chính xác của mình. Đây là nơi tôi bị kẹt. Tôi có giá trị rgb tôi nhận được từ đoạn PLTE của hình ảnh png. Tôi muốn thiết lập định dạng kết cấu. Nhưng loại màu của hình ảnh là 3 là màu được lập chỉ mục. Thông thường đối với các loại màu khác như 0 (PNG_COLOR_TYPE_GRAY) tôi đặt định dạng kết cấu là 0x1909 (GL_LUMINANCE). Nhưng tôi nên làm gì cho loại màu 3? Tôi đã tạo một bài đăng về nó http://stackoverflow.com/questions/14373099/png-image-texture-format-for-color-type-3 – Tahlil

Các vấn đề liên quan