Lire des images BMP en mode binaire

Discutez d'informatique ici !
lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 14:00

Lire des images BMP en mode binaire

par lapras » 10 Juin 2008, 12:54

Bonjour,
je souhaite lire une image BMP en binaire (mode rb avec fopen). Pour cela j'utilise fread pour lire "fichier" et j'utilise fwrite pour faire une copie de "fichier" dans un fichier "fichier2". L'ouverture des fichiers se fait tres bien, mais le probleme c'est qu'apres l'execution du prgm, déja le fichier "fichier2" fait une 20aine d'octets en moins que fichier et n'est pas lisible (fichier invalide). Pourquoi ?
Code: Tout sélectionner
 
fichier = fopen("fichier.bmp", "rb"); //on ouvre le fichier en question en mode binaire
                                  if (fichier != NULL)
                                  {
                                        printf("Fichier ouvert\n");
                                        while (n=fread(contenu, sizeof(char), 1000, fichier)!=0) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
                                        {
                                               fwrite (contenu, sizeof(char), n, fichier2);
                                        }
                                        printf("Fichier lu\n");
                                        fclose(fichier);
 


merci d'avance
Lapras



Dominique Lefebvre
Membre Légendaire
Messages: 8007
Enregistré le: 03 Déc 2005, 14:00

par Dominique Lefebvre » 10 Juin 2008, 12:57

lapras a écrit:Bonjour,
je souhaite lire une image BMP en binaire (mode rb avec fopen). Pour cela j'utilise fread pour lire "fichier" et j'utilise fwrite pour faire une copie de "fichier" dans un fichier "fichier2". L'ouverture des fichiers se fait tres bien, mais le probleme c'est qu'apres l'execution du prgm, déja le fichier "fichier2" fait une 20aine d'octets en moins que fichier et n'est pas lisible (fichier invalide). Pourquoi ?
Code: Tout sélectionner
 
fichier = fopen("image1.bmp", "rb"); //on ouvre le fichier en question en mode binaire
if (fichier != NULL)
{
printf("Fichier ouvert\n");
while (n=fread(contenu, sizeof(char), 1000, fichier)!=0) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
{
fwrite (contenu, sizeof(char), n, fichier2);
}
printf("Fichier lu\n");
fclose(fichier);
 


merci d'avance
Lapras

Salut Lapras,
Bine sur, ton fichier "fichier" contient moins de 1000 octets...

Dominique Lefebvre
Membre Légendaire
Messages: 8007
Enregistré le: 03 Déc 2005, 14:00

par Dominique Lefebvre » 10 Juin 2008, 12:58

Dominique Lefebvre a écrit:Salut Lapras,
Bine sur, ton fichier "fichier" contient moins de 1000 octets...

Et quel est le type de "contenu"?

lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 14:00

par lapras » 10 Juin 2008, 12:59

Mon fichier est une image de 905kO.
contenu est un tableau de char
Code: Tout sélectionner
char contenu[10000]="";

Dominique Lefebvre
Membre Légendaire
Messages: 8007
Enregistré le: 03 Déc 2005, 14:00

par Dominique Lefebvre » 10 Juin 2008, 13:06

lapras a écrit:Mon fichier est une image de 905kO.
contenu est un tableau de char
Code: Tout sélectionner
char contenu[10000]="";


Dans ton n=fread(contenu, sizeof(char), 1000, fichier) tu lis 1000 octets!
De plus, les fichiers bmp ont un format spécial et il est probable que tu le détruits en ne lisant que les 1000 premiers octets.
Connais-tu le format des fichiers BMP?

PS : ta chaîne est trop petite pour stocker 905 ko !

lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 14:00

par lapras » 10 Juin 2008, 13:08

Je ne lis pas que les 1000 premiers octets puisque j'ai une boucle qui s'arrete que quand on a fini la lecture du fichier.
Oui je connais un peu le format bmp (header, etc...)

Dominique Lefebvre
Membre Légendaire
Messages: 8007
Enregistré le: 03 Déc 2005, 14:00

par Dominique Lefebvre » 10 Juin 2008, 13:10

lapras a écrit:Je ne lis pas que les 1000 premiers octets puisque j'ai une boucle qui s'arrete que quand on a fini la lecture du fichier.
Oui je connais un peu le format bmp (header, etc...)


je ne crois pas: mets un printf et regarde combien de fois tu parcours ta boucle...

Dominique Lefebvre
Membre Légendaire
Messages: 8007
Enregistré le: 03 Déc 2005, 14:00

par Dominique Lefebvre » 10 Juin 2008, 13:12

Dominique Lefebvre a écrit:je ne crois pas: mets un printf et regarde combien de fois tu parcours ta boucle...

En fait, tu peux faire mieux : calcule le nombre de caractéres lus en cumulant n

Dominique Lefebvre
Membre Légendaire
Messages: 8007
Enregistré le: 03 Déc 2005, 14:00

par Dominique Lefebvre » 10 Juin 2008, 13:13

Et aussi, dans ton code, je ne vois pas le fclose sur fichier2

lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 14:00

par lapras » 10 Juin 2008, 13:14

C'est déja fait : la boucle fait 925 tours.
Mon code n'est pas complet mais bien sur je fclose apres !

Dominique Lefebvre
Membre Légendaire
Messages: 8007
Enregistré le: 03 Déc 2005, 14:00

par Dominique Lefebvre » 10 Juin 2008, 13:15

Autre source d'erreur: comme tu ne réinitialise pas "contenu" entre deux lectures/écritures, lors de la dernière lecture, tu peux conserver des données de l'avant dernière lecture et donc écrire quelque chose après la marque de fin de fichier de fichier2

lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 14:00

par lapras » 10 Juin 2008, 13:16

En fait j'ai des nouvelles : l'image fichier2.bmp est créée mais est tres déformée par rapport à fichier1 (grosses rayures de couleurs au milieu)
Je réénitialise bien contenu avec un memset :
memset (contenu, 0, sizeof (contenu));

Dominique Lefebvre
Membre Légendaire
Messages: 8007
Enregistré le: 03 Déc 2005, 14:00

par Dominique Lefebvre » 10 Juin 2008, 13:22

lapras a écrit:En fait j'ai des nouvelles : l'image fichier2.bmp est créée mais est tres déformée par rapport à fichier1 (grosses rayures de couleurs au milieu)
Je réénitialise bien contenu avec un memset :
memset (contenu, 0, sizeof (contenu));

Désolé, je ne l'ai pas vu dans ton code...
Il y a manifestement un défaut dans la recopie...Au lieu d'utiliser des caractères, essaye un buffer d'entiers....

lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 14:00

par lapras » 10 Juin 2008, 14:07

Oui je ne met pas le code en entier car en fait la gestion de fichier fait parti d'un autre programme et j'ai du en supprimer des boutsd.
Maintenant mon programme marche : j'ai réglé la taille de mes tableaux et la taille des bloque d'octets que je lisais :happy2:

Dominique Lefebvre
Membre Légendaire
Messages: 8007
Enregistré le: 03 Déc 2005, 14:00

par Dominique Lefebvre » 10 Juin 2008, 14:14

lapras a écrit:Oui je ne met pas le code en entier car en fait la gestion de fichier fait parti d'un autre programme et j'ai du en supprimer des boutsd.
Maintenant mon programme marche : j'ai réglé la taille de mes tableaux et la taille des bloque d'octets que je lisais :happy2:

Parfait! J'ai regardé des vieux codes qui faisaient ce genre de truc. Ils utilisent le type BYTE (unsigned char) plutôt que le char...

lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 14:00

par lapras » 10 Juin 2008, 14:20

Exactement c'est ce que j'ai fait !
Maintenant avec mes programmes socket je peux m'envoyer des fichiers via ordi.
Connaitrais tu une commande windows qui fasse une capture d'écran et l'enregistre en image bmp ?

Dominique Lefebvre
Membre Légendaire
Messages: 8007
Enregistré le: 03 Déc 2005, 14:00

par Dominique Lefebvre » 10 Juin 2008, 14:27

lapras a écrit:Exactement c'est ce que j'ai fait !
Maintenant avec mes programmes socket je peux m'envoyer des fichiers via ordi.
Connaitrais tu une commande windows qui fasse une capture d'écran et l'enregistre en image bmp ?

La seule que je connaisse c'est la touche Impr de ton clavier (qui copie tt l'écran) ou alt+Impr qui copie la fenêtre active. Les deux séquences copient dans le Presse-papier. Charge à toi d'en récupérer le contenu.

lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 14:00

par lapras » 10 Juin 2008, 14:28

Ok je vais voir ca ! :we:

lapras
Membre Transcendant
Messages: 3664
Enregistré le: 01 Jan 2007, 14:00

par lapras » 10 Juin 2008, 15:03

Apres plusieurs recherches je ne vois toujours pas comment accéder au presse papier en C... (d'ailleurs je ne sais meme pas y accéder tout court)

Dominique Lefebvre
Membre Légendaire
Messages: 8007
Enregistré le: 03 Déc 2005, 14:00

par Dominique Lefebvre » 10 Juin 2008, 15:14

lapras a écrit:Apres plusieurs recherches je ne vois toujours pas comment accéder au presse papier en C... (d'ailleurs je ne sais meme pas y accéder tout court)

Je vais essayer de te trouver ça... Il me semble qu'il y a une API Windows pour ça..

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite