Forum Clubic

[résolu] Traitement de l'image (recopiage d'image)

Salut !

J’expose mon petit problème puis mon code ensuite !
Voila, je tente le recopiage d’une image BMP avec un code de lecture d’image que mon maître de stage m’a filé auquel j’ai rajouté un peu de code afin de recupérer cette même image dans un autre fichier (programmation banale).
Le problème c’est que l’image recopiée quand je vais la voir ne fait que quelques octects alors que l’image de base fait plus de 3 Mo.
Lorsque je vais modifier cette image avec Paint, que j’y mets juste un point et que j’enregistre la modif apportée et bien là comme par miracle l’image prend la même taille que celle d’origine mais ne ressemble en aucun cas à l’image de départ.
Donc si vous voyez quelque modif à faire à mon code n’hésitez pas.
Moi je n’ai rajouté que les lignes qui sont précédées d’un /**/


//---------------------------------------------------------------------------
int BMP_LireImage (const char *nomFichier, unsigned char *bufferImg, int tailleBuffer)
//---------------------------------------------------------------------------
{
int F;
int Fnew;
BITMAPFILEHEADER	bmpFileHeader;
BITMAPINFOHEADER	bmpInfoHeader;
int tailleImg;

	F = OpenFile (nomFichier, VAL_READ_ONLY, VAL_OPEN_AS_IS, VAL_BINARY);
	/**/
	Fnew = OpenFile ("img/Test laser new.bmp", VAL_WRITE_ONLY, VAL_OPEN_AS_IS, VAL_BINARY); 
	
	if (F<0) return -1;
	//lire l'entête
	ReadFile(F, (char*)&bmpFileHeader, sizeof(bmpFileHeader));
	if (!(bmpFileHeader.bfType == ('M'<<8)|'B')) {
  //erreur
  return -1;
  }
	/**/
	WriteFile(Fnew,(char *)&bmpFileHeader, sizeof(bmpFileHeader));
	
	ReadFile(F, (char*) &bmpInfoHeader, sizeof(bmpInfoHeader));
	/**/
	WriteFile(Fnew,(char*) &bmpInfoHeader, sizeof(bmpInfoHeader)); 
	
	
	//vérifier que le buffer a une taille suffisante
	tailleImg = bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * bmpInfoHeader.biBitCount/8;
	if(tailleBuffer<tailleImg) return -1;
	
	//pointer et lire le buffer image
	SetFilePtr (F, bmpFileHeader.bfOffBits, 0);
	ReadFile(F, bufferImg, tailleImg); 
	/**/
	WriteFile(Fnew,bufferImg, sizeof(bufferImg)); 
	/**/
	
	CloseFile(Fnew);
	CloseFile(F);
	return 0;
}

Ton bufferImg est alloué?
C’est le readfile qui s’en charge?
Le fichier F fait bien 3Mo?

oui j’ai alloué de la mémoire pour mon buffer d’image et mon fichier fait bien 3 Mo !
voili voilou !

j’a l’impression que l’image fait la même taille parce que la copie de l’header a marché, mais je dirais que le reste de la copie a échoué à cause de ce test


	if(tailleBuffer<tailleImg) return -1;


dès que l’image est plus grosse que le buffer, tu sort là dessus, essaie sur une petite image pour analyser, ou de monter le buffer à plus de 3 Mo.
mais la bonne façon de faire est de ne lire que la taille du buffer, et de boucler jusqu’à la fin du fichier (d’ailleurs il doit déjà y avoir des algo de copie de fichier un peu mieux fait en C, je m’en remet aux autres forumeurs)

non non il passe ce test sans problème ! et pour info mon image fait plus de 3 Mo, le problème ne vient pas de là à mon avis !
je pense que c’est un writeFile qui merde mais j’en suis pas sûr …

Ton code est correct, a mon avis soit ta bibliothèque merdouille soit tu l’apelles mal.

Essaie de trouver un tuto/sample…

erf j’ai jamais rien trouvé sur ce genre de problème ! et pourtant j’ai cherché et cherché avant de venir poster sur le forum !

alors je sais pas quoi faire !

Je mettrais plutôt :

WriteFile(Fnew,bufferImg, tailleBuffer);

Si ca ne marche tjrs pas, fait une boucle pour écrire par morceau :

; pseudo code, évidemment
bytesaecrire = tailleImg;
bufferlen = 4096;
tant que bytesaecrire > 0
byteslus = ReadFile(F, bufferImg, bufferlen);
bytesaecrire - byteslus;
fin tant que

j’ai viré le sizeof comme tu m’as dit et çà marche !
super !
2 jours de perdu pour une connerie !
merci KarlKox :clap:

Content que ça marche :super: