Une image, decoupé en 9, puzzle => besoin d'aide :)

Une image, decoupé en 9, puzzle => besoin d'aide :) - C - Programmation

Marsh Posté le 08-03-2008 à 17:12:50    

Salut à tous !
 
Je suis en DUT info premiere année, et nous avons un petit programme à faire, qui consiste a faire un puzzle d'une image source.
 
Mon idée : l'image source est d'une resolution de 411px de hauteur sur 549 de longeur. Je dois la decouper en 9 morceaux, puis mettre ces morceaux dans le desordre pour obtenir un puzzle.
 
0---183---366---549
|
137
|
274
|
411------------------
 
J'ai decoupé l'image comme ceci pour avoir les 9 morceaux, mais mon probleme se situe au moment de les retranscrire dans le fichier de destination, j'obtien une image tout brouillé qui n'est pas du tout ce que j'attend.
 
J'ai tenté ceci :
 

Code :
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i,j,k,l,cpt,tabimage[411][549];
  5. FILE *f,*g;
  6. cpt = 0;
  7.     f= (FILE *) fopen("image1.pgm","r" );
  8.     // Ouverture du fichier image dans le dossier du fichier source
  9.     g= (FILE *) fopen("image_puzzle.pgm","w" );
  10.     // Ouverture du fichier de destination en ecriture.
  11.     while (! feof(f) )
  12.     {
  13.       while (cpt < 3) // Tant qu'il n'y a pas 3 retours à la ligne, on lit f et on ecrit dans g.
  14.         {
  15.         i = fgetc(f);
  16.         fputc(i,g);
  17.         if (i == '\n')
  18.         {
  19.             cpt++;
  20.         }
  21.         }
  22. for (i=0 ; i<411 ; i++) // Remplissage de la matrice avec les valeurs du ficheir image.
  23. {
  24.     for(j=0 ; j<549 ; j++)
  25.     {
  26.         tabimage[i][j] = fgetc(f);
  27.     }
  28. }
  29. for (i=0; i< 411 ; i++) // Verification du remplissage de la matrice.
  30. {
  31.     for (j=0; j<549; j++)
  32.     {
  33. printf("%ld",tabimage[i][j]);
  34.     }
  35. }
  36. for (k=137 ; k< 274 ; k++)
  37.     {
  38.         for (l=186 ; l< 366 ; l++)
  39.         {
  40.         fputc(tabimage[k][l],g);
  41.         }
  42.     }
  43.         for (k=274 ; k< 411 ; k++)
  44.     {
  45.         for (l=366 ; l< 549 ; l++)
  46.         {
  47.         fputc(tabimage[k][l],g);
  48.         }
  49.     }
  50.         for (k=137 ; k< 274 ; k++)
  51.     {
  52.         for (l=366 ; l< 549 ; l++)
  53.         {
  54.         fputc(tabimage[k][l],g);
  55.         }
  56.     }
  57.     for (k=0 ; k< 137 ; k++)
  58.     {
  59.         for (l=0 ; l< 183 ; l++)
  60.         {
  61.         fputc(tabimage[k][l],g);
  62.         }
  63.     }
  64.     for (k=274 ; k< 411 ; k++)
  65.     {
  66.         for (l=0 ; l< 183 ; l++)
  67.         {
  68.         fputc(tabimage[k][l],g);
  69.         }
  70.     }
  71.         for (k=0 ; k< 137 ; k++)
  72.     {
  73.         for (l=183 ; l< 366 ; l++)
  74.         {
  75.         fputc(tabimage[k][l],g);
  76.         }
  77.     }
  78.         for (k=137 ; k< 274 ; k++)
  79.     {
  80.         for (l=0 ; l< 183 ; l++)
  81.         {
  82.         fputc(tabimage[k][l],g);
  83.         }
  84.     }
  85.         for (k=0 ; k< 137 ; k++)
  86.     {
  87.         for (l=366 ; l< 549 ; l++)
  88.         {
  89.         fputc(tabimage[k][l],g);
  90.         }
  91.     }
  92.         for (k=274 ; k< 411 ; k++)
  93.     {
  94.         for (l=183 ; l< 366 ; l++)
  95.         {
  96.         fputc(tabimage[k][l],g);
  97.         }
  98.     }
  99.     fclose(f);
  100.     fclose(g);
  101.     }


 
Faire 9 boucles qui ont comme borne celles de mes 9 morceaux.
 
La matrice ce remplie bien du code de l'image car lorsque je met ce qu'il y'a dans cette matrice dans l'aimage de destination, j'obtien le fichier source.
 
J'ai pensé que lorsque la matrice se remplie du fichier source, les donnée dans chaque petit carré que j'ai crée sont comme ceci :
 
---------
---------
---------
---------
 
Et que lorsque je souhaite les retranscrire dans le fichier de destination, ben il ecris les lignes les une a la suite des autres :
 
------------------------------------------
 
et que donc sa foirait la.
 
Si vous avez une idée, je suis preneur :)
 
PS : mon code vous semblera surement pas optimal, mais nous avons commencé le C que depuis 3 semaines (et oui, ADA tout le premier semestre) donc je fais surement des choses à pas faire, mais il me manque juste l'idée pour bien restranscrire mes 9 mirceaux.
 
Merci :)


---------------
rFactor | HP WebOS | J'écris des choses
Reply

Marsh Posté le 08-03-2008 à 17:12:50   

Reply

Marsh Posté le 08-03-2008 à 20:38:17    

j'ai pas suivi toutes tes boucles (mal indenté) mais s'il manque les retours à la ligne, c'est qu'il faut que tu les rajoutes toi même.
ce qui donnerait:

Code :
  1. for (j=0;j<nb_lignes_morceau;j++)
  2. {
  3.     for (k=0;k<3;k++)
  4.     {
  5.          /*
  6.         definir ici abscisse_debut_morceau et ordonnee_debut_morceau selon le morceau que tu veux         afficher et selon k.
  7.         (si k=0 c'est le morceau le plus à gauche, k=1 c'est celui du milieu et k=2 c'est celui de         droite)
  8.         */
  9.         /* on écrit la ligne j du morceau en cours:*/
  10.         for (i=0;i<nb_colonnes_morceau;i++)
  11.         {
  12.            fputc (matrice [j+ordonnee_debut_morceau][i+abscisse_debut_morceau],g);
  13.         }
  14.     }
  15.     fputc ('\n',g); /*fin de ligne*/
  16. }


Il faut ensuite rajouter une boucle pour les 3 lignes de morceau x (là ça ne fait que les trois premiers en fait).

 

edit: je comprends les problèmes d'indentation, moi qui avais essayé d'aligner les commentaires...
edit 2: c'est quoi ton histoire de 3 retours à la ligne au début?
          j'ajouterai qu'il existe des fonctions qui lisent ou écrivent plusieurs caractères à la fois, ça t'enlèverait une boucle de lire toute une ligne d'un coup ou d'écrire toute une ligne d'un morceau en une fois. D'ailleurs avec man fputc et man fgetc on obtient aussi les infos sur lesdites fonctions.


Message édité par ptitchep le 08-03-2008 à 20:51:18

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 08-03-2008 à 21:05:05    

Salut, merci de t'intéresser à mon cas. :)
 
Pour les 3 lignes au début, c'est simplement l'entête du fichier, notre prof nous a donné un fichier en .pgm, il y'a 3 lignes d'entête (une qui dit le format du fichier, l'autre la taille de l'image et la 3eme je ne sais plus), le reste étant l'image, donc je prend les 3 premières lignes puis je les recopie dans le fichier de destination, et apres, je met le reste dans une matrice pour le découper en 9 et renvoyer ces 9 petites morceaux dans le désordre, pour avoir un puzzle si tu veux.
 
Je vais me pencher sur ta solution voir si j'arrive à quelque chose.
 
Merci :)
 
@plouche


---------------
rFactor | HP WebOS | J'écris des choses
Reply

Marsh Posté le 08-03-2008 à 21:07:49    

Si la taille du fichier est dans l'entête, c'est normal que tes données soient écrites sous cette forme:
-------------------------
et pas  
------
-----
-------
C'est au logiciel qui ouvre le fichier de gérer les fins de ligne puisqu'il connait la taille d'une ligne non?


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 08-03-2008 à 21:16:35    

Je pense que si mes données sont ecrite en ligne, c'est tout simplement que lorsqu'il lit le morceau de matrice, et qu'il passe a une autre ligne, il n'y a pas de caractère '\n' donc il va continuer jusqu'a atteindre la valeur de 549 (largeur de l'image) je pense.
 
Mais je t'avoue que notre prof n'a pas tellement pris le temps de nous expliquer tout ceci, et c'est donc a nous de chercher, je cherche depuis mercredi, mais pas comme il faut visiblement.


---------------
rFactor | HP WebOS | J'écris des choses
Reply

Marsh Posté le 08-03-2008 à 21:22:07    

Dans le fichier d'origine, tout est écrit sur une seule ligne non? C'est toi qui, connaissant la taille d'une ligne, place les infos dans une matrice à 2 dimensions.  
Pour l'image de destination c'est le même principe. Tu écris l'en-tête puis tous les pixels à la suite (comme tu fais d'ailleurs).
Si tu veux l'afficher, tu lis l'en-tête (faut bien qu'il serve à qqchose) tu en déduis la taille de ta matrice et tu la remplis comme tu as fait la première fois. Ensuite tu affiches tes pixels en lignes et en colonnes en te basant sur ta matrice.
Il n'y a donc pas de retour à la ligne dans le fichier (sauf pour l'en-tête apparemment).
 
moi j'avais cru comprendre que c'était une "image" en ASCII pour un exo c'est fréquent genre
 
aaaabbbbcccc
ddddeeeeffff
gggghhhhiiii
 
(l'est belle mon image hein?)


Message édité par ptitchep le 08-03-2008 à 21:23:27

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 08-03-2008 à 21:28:44    

Sur notre feuille de TD on a :

 

Exemple de debut de fichier pgm :

 

P5
440 288
255
990D*DTDMBM................

 

Dans ma tete je pensais pas que tout etait stocké sur une seule ligne apres l'entete, ptetre pour ça que j'ai du mal.

 

Bon ben je vais me repencher sur la question.

 

Merci pour tes explications :)
Bonne soirée.

 

edit : non c'est pas du ASCII, c'est une image avec 2 beaux chevaux et 2 belles vaches dans la campagne :D


Message édité par Turbo16 le 08-03-2008 à 21:29:48

---------------
rFactor | HP WebOS | J'écris des choses
Reply

Marsh Posté le 08-03-2008 à 21:37:09    

de rien, bon courage.
Si ton image est brouillée, ce sont tes boucles qui ne sont pas bonnes. Cela dit mon code devrait fonctionner (je ne l'ai pas testé) si tu enlèves l'ecriture du \n.
 
bonne soirée à toi aussi.
 


---------------
deluser --remove-home ptitchep
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed