2017-06-07 1 views
-2

J'essaie d'obtenir la hauteur et la largeur d'une image bmp, mais les valeurs que je reçois sont incorrectes et ne sont pas la taille réelle de l'image.
Voici mon code pour le faire:C en-tête bmp contient des informations erronées

#include <stdio.h> 
#include <stdlib.h> 

void main() { 
FILE * Pic; 
errno_t err; 
int **PixelStrength; 
int PictureWidth, PictureHeight; 


err = fopen_s(&Pic, "d2.bmp", "r"); 
if (!err) 
{ 

    fseek(Pic, 18, SEEK_SET); 
    PictureWidth = fgetc(Pic); 
    fseek(Pic, 22, SEEK_SET); 
    PictureHeight = fgetc(Pic); 
} 


if (Pic) 
{ 
    err = fclose(Pic); 
} 
} 

Je dois souligner que cela a fonctionné pour une petite image mais pas pour tout plus grand. Les images que j'ai essayées sont 640 x 480 mais les valeurs que je reçois sont de 128 x 224. Merci pour votre aide.

+1

640 = 2 * 256 + 128; 480 = 256 + 224 – pmg

+0

Je vous recommande de définir un en-tête 'struct' et de lire le tout, en utilisant des fonctions pour extraire les membres de la bonne manière, ou un tableau d'octets idem. –

+1

Un autre problème: 'fopen_s (& Pic," d2.bmp "," r ");' -> 'fopen_s (& Pic," d2.bmp "," rb ");' Ajouter 'b'. Ouvrir le fichier en mode binaire. – chux

Répondre

1

fgetc() récupère un seul octet à partir du fichier. Les valeurs de hauteur et de largeur sont stockées en tant que little-endian 32 bits. 640 est 0x280, et 480 est 0x1E0, donc les valeurs que vous obtenez sont 0x80 (128) et 0xE0 (224), juste l'octet de poids faible des valeurs.

Essayez quelque chose comme

PictureWidth = fgetc(Pic); 
PictureWidth += 256 * fgetc(Pic); 

(Oui, ils sont vraiment des valeurs 32 bits, ce qui est de quatre octets, mais il est peu probable que vous tomberez dans un large BPM à tout moment 70000 pixels bientôt).

+0

Je ne pense pas que vous puissiez compter sur les appels 'fgetc()' en cours d'exécution de gauche à droite. Faites-les en tant que déclarations distinctes. – Barmar

+0

Bon point, merci. –