2 votes

Format d'image et tableaux de caractères non signés

Je développe des fonctions d'imagerie (oui, je veux VRAIMENT réinventer la roue pour diverses raisons).

Je copie des bitmaps dans des tableaux de caractères non signés, mais j'ai un problème avec la taille des octets par rapport au format des pixels de l'image.

par exemple, beaucoup d'images sont fournies en 24 bits par pixel pour la représentation RVB, donc c'est plutôt facile, chaque pixel a 3 caractères non signés (octets) et tout le monde est content.

Cependant, parfois, le RVB a des types plus bizarres comme 48 bits par pixel, donc 16 bits par canal de couleur. Copier l'image entière dans le tableau d'octets fonctionne bien, mais c'est lorsque je veux récupérer les données que les choses deviennent floues.

Actuellement, j'ai le code suivant pour obtenir un seul pixel pour les images en niveaux de gris

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

NImage::data est un tableau de caractères non signés.

Cela renvoie un seul octet. Comment puis-je accéder à mon tableau de données avec différents formats de pixels ?

2voto

alemjerus Points 3729

Tu devrais le faire comme ça :

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];
   }

1voto

À 48 bits par pixel, avec 16 bits par couleur, vous ne pouvez pas renvoyer une valeur de 8 bits, vous devez renvoyer une valeur de 16 bits. short o unsigned short sinon les données seront tronquées.

Vous pouvez essayer de développer des fonctions surchargées pour gérer cela.

1voto

John Points 12438

Vous devez savoir quelle est la taille de vos pixels.

S'il s'agit de RVB, votre image de 100x100 pixels (disons) comportera 30 000 caractères non signés.

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]; 
}

Ou pour le RVB 48 bits,

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 ...

0voto

Alexander Gessler Points 26717

Quel est le problème avec 48bits par pixel ? Il suffit de lire vos données en tant que uint16_t ou unsigned short pour que les 16 bits soient extraits correctement.

Cela s'aggrave pour les modèles binaires plus compliqués, par exemple rgb565, pour lesquels vous devrez extraire des données en utilisant des masques binaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X