2011-04-21 11 views
5

me estoy acercando a C++ con algunos gráficos de computadora básicos.¿por qué chas sin firmar para datos de píxeles RGB?

píxeles de datos se suele representar como:

unsigned char *pixels 

y un unsigned char es bueno porque es un valor entre 0 y 255 (256 = 2^8 debido a que un char es 2 bytes y 1 byte es de 8 bits ?). y esto es bueno porque en el color RGB se representan con un número entre 0 y 255.

pero .. entiendo esto como una imagen monocromática, en una imagen normal tengo RGB, tendría 3 array de chamuscado no distorsionado, uno para rojo, uno para verde, uno para azul. algo así como:

unsigned char *pixels[3] 

pero nunca encontré algo similar para los datos de píxeles RGB

+4

1 byte es de 8 bits. Un bit tiene 2 estados. Entonces un byte, 8 bits, tiene 2^8 estados.Por lo tanto, 1 byte tiene 2^8 = 256 estados posibles distintos. Un carácter sin signo es 1 byte con 256 valores distintos, 0 a 255. – Ishtar

Respuesta

3

Con píxeles * [3] que tienes matrices independientes para los tres componentes de color, mientras que en los archivos de las tres componentes de color para un solo píxel se almacenan juntos. También significa que usted puede utilizar un solo fread()/fwrite() para todo el bloque de datos de imagen,

4
unsigned char *pixels[3]; 

declara una matriz de tres punteros a unsigned char. No estoy seguro si eso es lo que querías.

Existen varias formas diferentes de representar píxeles. La más sencilla es probablemente algo como:

struct Pixel 
{ 
    unsigned char red; 
    unsigned char green; 
    unsigned char blue; 
}; 

Pero puede que tenga que (o quiere) cumplir con un formato externo. Otra posibilidad frecuente es poner los tres colores en un uint32_t. Además, en algunos sistemas gráficos, puede haber un cuarto elemento y alfa, que representa transparencia.

9

imágenes RGB se almacenan por lo general con el fin intercalada (R1, G1, B1, R2, G2, B2, ...), así que un puntero (a R1) es suficiente.

Esto hace que sea un poco más difícil de abordar los píxeles individuales: pixel con el índice de N se almacena a pixels[3*N+0], pixels[3*N+1] y pixels[3*N+2] en lugar de sólo red[N], green[N], blue[N].

Sin embargo, esto tiene la ventaja de permitir un acceso más rápido: menos punteros conducen a programas más fáciles, mejorando su velocidad; el orden intercalado también hace que el almacenamiento en memoria caché sea más efectivo.

3

Realmente cada vez que se refiere a un bloque de bytes, será del tipo unsigned char* debido al hecho de que unsigned char por la especificación C no tiene relleno en el tipo en sí (es decir, cada bit se usa para un valor en el byte, y no hay bits de acolchados que no se utilizan), y pixel-datos va a ser algún bloque de X bytes sin relleno (al menos no acolchado interno ... no pueden ser relleno al final de la memoria intermedia para fines de alineación). También lo más probable es que se asigne en el montón a alguna parte. Así que no importa si va a ser en blanco y negro, de color a datos, etc., que a menudo se encuentra que un búfer de píxeles se señaló a través de un puntero unsigned char, y es posible que luego echarlo a algunos struct como James menciona con el fin de facilidad acceder a la información de píxeles. En otras ocasiones, puede que tenga que indexar en el búfer como menciona anatolyg. Pero al final, un tampón de píxeles es sólo una memoria intermedia de datos, y un tampón general de datos bytes deben ser accesibles en C/C++ utilizando el tipo de unsigned char*.

Cuestiones relacionadas