8
votes

Obtenir la valeur de pixel du fichier BMP

J'ai une question pour lire une image BMP. Comment puis-je obtenir la valeur de pixels (r, g, b valeurs) dans une image BMP? Quelqu'un peut-il m'aider à utiliser le langage de programmation C?


0 commentaires

3 Réponses :


8
votes

Le moyen facile de trouver une bibliothèque de manipulation de bonne image pour votre plate-forme choisie et d'utiliser cela.


0 commentaires

7
votes

Vous devez étudier le format de fichier BMP. Il est plus facile de lire des fichiers BMP de 24 bits non compressés. Ils contiennent simplement une en-tête aux valeurs de début et de RVB de chaque pixel.

Pour commencer, vérifiez l'exemple de l'image 2x2 bitmap sur http://en.wikipedia.org / wiki / bmp_file_format . Suivez les étapes ci-dessous.

  1. Créez l'image BMP 2x2 illustrée sur Wikipedia.
  2. Ouvrez le fichier en mode binaire à l'aide de votre programme C.
  3. recherche à la position d'octet 54.
  4. Lire 3 octets.

    Les octets seraient respectivement 0, 0 et 255. (Je ne sais pas si la commande est RVB. J'avais fait ce long retour et je pense que la commande n'est pas RVB. Vérifiez simplement cela.)

    aussi simple que ça! Étudiez l'en-tête du BMP pour en savoir plus sur le format.


0 commentaires

14
votes

Remarque: Vous devrez peut-être saisir un octet supplémentaire pour les valeurs alpha si votre BMP a une chaîne alpha. Dans ce cas, l'image serait image [pixelcount] [4] code>, et vous ajouteriez une autre getc (streamin) code> ligne pour contenir ce quatrième index. Mon BMP s'est avéré pas besoin de cela.

 // super-simplified BMP read algorithm to pull out RGB data
 // read image for coloring scheme
 int image[1024][3]; // first number here is 1024 pixels in my image, 3 is for RGB values
 FILE *streamIn;
 streamIn = fopen("./mybitmap.bmp", "r");
 if (streamIn == (FILE *)0){
   printf("File opening error ocurred. Exiting program.\n");
   exit(0);
 }

 int byte;
 int count = 0;
 for(i=0;i<54;i++) byte = getc(streamIn);  // strip out BMP header

 for(i=0;i<1024;i++){    // foreach pixel
    image[i][2] = getc(streamIn);  // use BMP 24bit with no alpha channel
    image[i][1] = getc(streamIn);  // BMP uses BGR but we want RGB, grab byte-by-byte
    image[i][0] = getc(streamIn);  // reverse-order array indexing fixes RGB issue...
    printf("pixel %d : [%d,%d,%d]\n",i+1,image[i][0],image[i][1],image[i][2]);
 }

 fclose(streamIn);


2 commentaires

N'y a-t-il pas un chunk en-tête, vous devez dépasser avant de toucher les données d'image?


@Anon Et si mon fichier est JPEG?