Lecture d'adresse et positionnement
Bonjour à tous,
me penchant sur la manipulation de fichiers images (bitmap), je cherche à positionner le curseur du fichier à la bonne adresse afin de récupérer une certaine plage d'octets (correspondant aux pixels de l'image). Pour cela, j'essaie de coder une fonction visant à ouvrir le fichier image, récupérer l'offset du 1er pixel et positionner mon curseur à cette adresse:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
void ouverture_image(char* path, FILE* fichier_image, char buffer_pixels[]){
size_t cpt;
/* ouverture du fichier image en lecture */
fichier_image = fopen(path, "r");
if (fichier_image == NULL){
fprintf(stderr, "erreur ouverture fichier image\n");
exit(1);
}
/* l'offset du 1er pixel est donné par les bits 10, 11, 12 et 13 de l'en-tête du fichier image */
cpt = fseek(fichier_image, 9, SEEK_SET);
/* récupération de l'offset du 1er pixel */
long offset;
cpt = fread(&offset, 8, 1, fichier_image);
if (cpt >= 1){
int pos;
printf("OFFSET: (hex) %lx \t (dec) %ld \n", offset, offset);
/* positionnement du curseur sur le 1er pixel */
fseek(fichier_image, offset, SEEK_SET);
}
else printf("erreur lecture offset");
} |
voici l'en-tête (en hexadécimal big-endian) du fichier bitmap sur lequel j'ai testé mon programme:
0000000 4d42 0038 0024 0000 0000 0036 0000 0028
0000010 0000 0400 0000 0300 0000 0001 0018 0000
0000020 0000 0002 0024 0b12 0000 0b12 0000 0000
0000030 0000 0000 0000 0707 0707 0707 0707 0707
0000040 0707 0707 0707 0707 0707 0707 0707 0707
en gras l'offset du 1er pixel de l'image: le 36eme octet (0x36),
en souligné le 1et octet du 1er pixel.
Et voici l'affichage produit lorsque je teste mon programme sur ce fichier:
OFFSET: 3600 13824
Mon problème est le suivant, pour positionner mon curseur sur le 1er pixel, la ligne de code:
Code:
1 2
| // Prototype: fseek(FILE*, long, int)
fseek(fichier_image, offset, SEEK_SET); |
n'offre pas le résultat attendu vu qu'offset est considéré comme un long (= 13824) au lieu d'être considéré comme une adresse (0x36).
Comment faire pour remédier à ce problème?
Merci à tous pour votre attention,
Heisen.