Obtenir la valeur de pixel du fichier BMP
Question
J'ai une question pour lire une image bmp. Comment puis-je obtenir la valeur de pixel (valeurs R, G, B) dans une image bmp? Quelqu'un peut-il me aider en utilisant le langage de programmation C?
La solution
La façon simple serait de trouver une bonne bibliothèque de manipulation d'images pour votre plate-forme choisie et l'utiliser.
- Linux imlib / GDK-Pixbuf (Gnome / GTK) / image QT (KDE / Qt) devrait être en mesure de faire ce que vous avez besoin.
- de Windows Je ne suis pas familier avec la bibliothèque de système approprié, mais un MSDN Rechercher " Bitmap" est probablement un bon endroit pour commencer.
- Mac OS X Le cacao a des capacités de manipulation d'images, voir cet article .
La dure serait d'ouvrir le fichier et interpréter réellement les données binaires au sein. Pour ce faire, vous aurez besoin BMP Spécification du fichier. Je vous recommande d'essayer le moyen facile d'abord.
Autres conseils
Remarque: vous devrez peut-être saisir un octet supplémentaire pour les valeurs alpha si votre BMP a canal alpha. Dans cette image de cas serait image[pixelcount][4]
, et vous devez ajouter une autre ligne de getc(streamIn)
pour tenir ce quatrième indice. Mon BMP est avéré pas besoin.
// 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);
~ Locutus
Vous devez étudier le format de fichier BMP. Il est plus facile de lire des fichiers non compressés BMP 24 bits. Ils contiennent juste un en-tête au début et les valeurs RVB de chaque pixel.
Pour commencer avec cela, vérifiez l'exemple de 2x2 image bitmap à http://en.wikipedia.org / wiki / BMP_file_format . Suivez les étapes ci-dessous.
- Créer l'image 2x2 BMP figurant sur Wikipedia.
- Ouvrez le fichier en mode binaire en utilisant votre programme C.
- Recherche de position d'octet 54.
- Lire 3 octets.
Les octets serait 0, 0 et 255 respectivement. (Je ne sais pas si l'ordre est RVB. Je l'avais fait ce long retour et je pense que l'ordre ne soit pas RVB. Il suffit de vérifier.)
Aussi simple que cela! Étudier l'en-tête du BMP pour comprendre plus sur le format.