Pregunta

Estoy desarrollando funciones de imagen (sí realmente quiero reinventar la rueda, por diversas razones).

estoy copiando mapas de bits en matrices unsigned char pero estoy teniendo algunos problemas con el tamaño de byte frente formato de imagen de píxeles.

, por ejemplo, una gran cantidad de imágenes venido como 24 bits por píxel para la representación RGB por lo que es bastante fácil, cada píxel tiene 3 caracteres sin signo (bytes) y todo el mundo está feliz

sin embargo a veces el RGB tiene tipos más extrañas como 48 bits por píxel así 16 bits por canal de color. Copiar toda la imagen en la matriz de bytes funciona bien, pero cuando su Quiero recuperar los datos que las cosas se ponen borrosas

Ahora mismo tengo el siguiente código para obtener un solo píxel de escala de grises

unsigned char NImage::get_pixel(int i, int j)
   {
   return this->data[j * pitch + i];
   }

nImage :: datos es matriz de caracteres sin signo

Esto devuelve un solo byte. ¿Cómo puedo acceder a mi matriz de datos con diferentes formatos de píxeles?

¿Fue útil?

Solución

Debe hacerlo de esta manera:

unsigned short NImage::get_pixel(int i, int j)
   {
       int offset = 2 * (j * pitch + i);
      // image pixels are usually stored in big-endian format
      return data[offset]*256 + data[offset+1];
   }

Otros consejos

A los 48 bits por píxel, con 16 bits por color, no se puede devolver un valor de 8 bits, debe devolver un short 16 bits o unsigned short lo contrario los datos se trunca.

Usted puede tratar de desarrollar funciones sobrecargadas de manejar esto.

Usted tiene que saber el tamaño de sus píxeles son.

Si entonces su imagen de 100x100 píxeles (por ejemplo) es RGB tendrá 30.000 caracteres sin signo.

unsigned char NImage::get_red_component(int i, int j) 
{ 
    return this->data[3*(j * pitch + i)]; 
}

unsigned char NImage::get_green_component(int i, int j) 
{ 
    return this->data[3*(j * pitch + i) + 1]; 
}

unsigned char NImage::get_blue_component(int i, int j) 
{ 
    return this->data[3*(j * pitch + i) + 2]; 
}

O de 48 bits RGB,

unsigned char NImage::get_red_MSB(int i, int j) 
{ 
    return this->data[6*(j * pitch + i)]; 
}

unsigned char NImage::get_red_LSB(int i, int j) 
{ 
    return this->data[6*(j * pitch + i) + 1]; 
}

... etc etc ...

¿Cuál es el problema con 48bits por píxel? Basta con leer los datos mientras que el uint16_t o sin firmar corta y se obtiene el bit 16 se extrae correctamente.

Pero hay algo peor para el patrón de bits más complicado, es decir RGB565 donde tendrá que extraer los datos usando máscaras de bits.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top