2 votes

Format d'image et tableaux non signés d'octets

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 unsigned char mais j'ai des problèmes avec la taille des octets par rapport au format de pixel de l'image.

Par exemple, de nombreuses images sont fournies avec 24 bits par pixel pour une représentation RGB, donc c'est plutôt facile, chaque pixel a 3 unsigned chars (octets) et tout le monde est content

mais parfois le RGB a des types plus étranges comme 48 bits par pixel donc 16 bits par canal de couleur. Copier toute l'image 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 unsigned char

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

2voto

alemjerus Points 3729

Vous devriez le faire de cette façon :

unsigned short NImage::get_pixel(int i, int j)
   {
       int offset = 2 * (j * pitch + i);
      // les pixels de l'image sont généralement stockés au format big-endian
      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 un short de 16 bits ou un 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 à quel point vos pixels sont grands.

Si c'est RGB alors votre image de 100x100 pixels (disons) aura 30 000 unsigned chars.

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 du RGB 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 48 bits par pixel? Il suffit de lire vos données en tant que uint16_t ou unsigned short et vous obtiendrez les 16 bits extraits correctement.

Cela devient plus compliqué pour un motif de bits plus compliqué, c'est-à-dire rgb565, où vous devrez extraire les données en utilisant des masques de bits.

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