fiston_67
Messages postés2Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention11 février 2004
-
10 févr. 2004 à 14:45
fiston_67
Messages postés2Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention11 février 2004
-
11 févr. 2004 à 00:14
Le problème est le suivant : je souhaite lire un fichier bmp couleur 24 bits et 16 millions de couleur, et stocker le resultat dans 3 matrices rouge, vert et bleu.
Voici le code que j'utilise :
int lit_bmp(char *source){ //source = fichier à lire
FILE * ptr_src;
if((ptr_src=fopen(source,"rb"))!=NULL)
{
for (int i=0;i<offset;i++) fgetc(ptr_src);
for (int y=0;y<hauteur;y++)
{
for (int x=0;x<longueur;x++)
{
ecran_b[x+y*longueur]=(unsigned char)fgetc(ptr_src);
//ecran_b, ecran_r et ecran_v designent des tableaux (correctement alloués ds une fct précédente
//ecran_r = contient les pixels rouges de l'image ...
ecran_v[x+y*longueur]=(unsigned char)fgetc(ptr_src);
ecran_r[x+y*longueur]=(unsigned char)fgetc(ptr_src);
}
}
fclose(ptr_src);
}
return 0;
}
Le problème est que quand je teste ce dernier (et que je reconstitue l'image, il y a "un decalage" très bizarre, particulièrement dans le tiers en haut à gauche de l'image. En consultant les archives, j'ai vu que je n'etais pas le seul à avoir ce problème. La solution suggérée est d'enregistrer une image en bmp 24 bits, mais l'image en question doit posséder 256 couleurs seulement.
Or, cela ne me satisfait pas, je veux pouvoir traiter des images à 16 millions de couleur, alors j'attend vos suggestions avec impatience.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 10 févr. 2004 à 21:01
j'ai déja rencontré ce problème.En fait selon la taille de la bitmap, entre chaque ligne, il peut y avoir 0, 1 ou 2 octets. Cela varie en fonction de la valeur de longeur%3.
Je ne suis pas sur de ce que je te dis, meme pas si c'est ca ton problème, mais tu n'as diminuer la largeur de ton image de 1 ou 2 pixels et normalement le pb disparait. Dans le cas général, tu dois dont lire 1 ou 2 caractères à la fin de chaque ligne en fonction de la valeur de longueur.
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 10 févr. 2004 à 22:42
oui c'est le probleme quil a, seulement c'est longeur % 4 et non pas 3
une petite finte et tu sera tranquil
met ce code en haut de ta fonction, la declaration de longueur_useless au debut, et longueur_useless = longueur % 4; juste apres avoir definit longueur;
int longueur_useless;
// ...
// definition de longueur;
longueur_useless = longueur % 4;
ensuite, a la fin de ta boucle x, tu met ca :
for (x = 0; x < longueur_useless; x++)
fgetc(ptr_src);
et voila, ca va te zapper automatiquement les donnes indesirable