IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

flip vertical d'une matrice


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 21
    Points : 9
    Points
    9
    Par défaut flip vertical d'une matrice
    Bonjour mon problème consiste à créer une fonction que fasse le flip vertical d'une image .ppm! Et donc pour cela je dois lire les informations de la matrice et puis ensuit trouver la fonction qui me fasse le flip et ensuit me sauvegarde le résultat dans un nouveau fichier! J'ai essaillé et j'ai presque réussi mais j'ai un ptit soucis! Le flip fonctionne mais les couleurs de l'image sont très bizarre! quand j'ouvre la photo de départ elle est normale on reconnait l'image et aprèsle flip l'image inverse est un peu noir et il me semble que le nombre de pixels est inférieur! Ca serais très gentil si vous pourriez m'aider car je dois terminer ce travail pour lundi en 8! Merci d'avance!

    La programation doit etre faite en language C et le compileur s'appelle Crimson Editor!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    #include <stdio.h>
    void main() {
    	FILE *fp;
    	int i, j,b,temp;
    	int a[324][195];
    	fp=fopen("moulin1.ppm","r");
    	for (i = 1; i < 324; i++)
    		{
    			for (j = 1; j < 195; j++)
    			{
    			fscanf(fp,"%d",&a[i][j]);
     
    		}
    		}
    		fclose(fp);
    		/*fp=fopen("Moulin2.ppm","w");
    		fprintf(fp,"P");
    		for (i = 1; i < 324; i++)
    		{
    			for (j = 1; j < 195; j++)
    			fprintf(fp,"%d ", a[i][j]);
    		 fprintf(fp,"\n");
     
    		}
    		fclose(fp);*/
            fp=fopen("fliphorizontal.ppm","w");
    		fprintf(fp,"P3\n");
    		fprintf(fp,"65 108\n");
    		fprintf(fp,"255\n");
    		for (i = 1; i < 324; i++)
    		/*{if (i == 1)
    		{for (b =5; b < 195; b++)
    		    j=324-i;
    			temp=a[i][b];
    	        a[i][b]=a[j][b];
    	        a[j][b]=temp;
    			fprintf(fp,"%d ", a[i][b]);
    			fprintf(fp,"\n");
    		    fprintf(fp,"%d ", a[j][b]);
    		    fprintf(fp,"\n");}
    		else*/ {for (b =1; b < 195; b++)
    		    {j=324-i;
    			    if (i<j)
    		    {
    			temp=a[i][b];
    	        a[i][b]=a[j][b];
    	        a[j][b]=temp;
    			fprintf(fp,"%d ", a[j][b]);
    			fprintf(fp,"%d ", a[i][b]);}
    	else break;}
    		}
    		fclose(fp);
    		}

  2. #2
    Membre actif
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Points : 268
    Points
    268
    Par défaut
    Juste une question basique, lorsque tu supprimes la partie "flip" de ton programme est-ce que tu obtiens une image identique à l'originale où est-ce que le couleurs sont déjà "très bizarres".
    Ca permettrait déjà de savoir si ton problème viens du retournement ou du formatage.

    Je ne comprend pas trop pourquoi tu retouches ton tableau lors des écritures plutôt que de l'utiliser tel quel en changeant juste l'ordre des accès.
    Ni pourquoi tu as 2 prints par élément du tableau: ton fichier de sortie est-il de la même taille que ton fichier d'entrée?

  3. #3
    Membre actif
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Points : 268
    Points
    268
    Par défaut
    Autre remarque:

    Je précise que je ne connais le format de fichier "ppm", mais a priori si tu as une entete dans ton fichier de sortie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            fp=fopen("fliphorizontal.ppm","w");
    		fprintf(fp,"P3\n");
    		fprintf(fp,"65 108\n");
    		fprintf(fp,"255\n");
    il doit sans doute y avoir une entete à traiter (au moins à skipper) dans ton fichier d'entrée.

  4. #4
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 21
    Points : 9
    Points
    9
    Par défaut rebonjour
    Et bien tout d'abord je tiens à vous remercier d'avoir chercher à comprendre mon problème et celui ci est en fait que je ne suis pas un pro de la programmation! :-( Je ne fais quede débuter et oui on a déjà un tel projet à réaliser pour lundi le 16 avril! Et pour le moment j'ai essaillé en cette direction mais il y a encore quelques problèmes mais si vous sauriez me suggérer une solution ou une autre fonction me donnant le meme résultat qui est un flip vertical en language C ca serait trop gentil et e vous en serait très reconnaissant! Je vais regarder une fois mtn ce que vous avez dirt à propos de la suppression et des tableaux mais je ne sais pas si je vais y arriver! Le problème pour le moment est que le fichier est tj aussi grand, il est bien inversé car on reconnait la meme image mais juste que les couleurs ne correspondent pas et il me semble aussi une intensité moins forte de pixels!

  5. #5
    Membre actif
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Points : 268
    Points
    268
    Par défaut
    Juste une remarque: est-ce voulu d'initialiser tes compteurs avec 1 au lieu de 0?

  6. #6
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 21
    Points : 9
    Points
    9
    Par défaut Recoucou
    bonjour ben c'est voulu oui et non! D'après je pensais que ce serrait pas mal d'initaliser à 0! Mais mon problème est mtn dans le flip horizontal! Hier soir j'ai encore travailler et chercher avec un ami et on a plus ou moins arrivé à un résultat concluant pour le flip vertical! Mais on n'arrive pas le horizontal! :-(

  7. #7
    Membre actif
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Points : 268
    Points
    268
    Par défaut
    ->Est ce que tu as des infos sur ton format de fichier, notement sur l'entete. Tu dois certainement préciser la largeur et la longeur de ton image.
    Si tu ne connais pas le format des données que tu manipules, ce n'est pas de la programmation c'est de la tambouille!

    ->Est ce que tu arrives à faire une copie sans modification de l'original?

    ->As tu toujours ton problème d'altération de couleur?

    ->Tu parles bien de flip en non pas de rotation, on est d'accord?

    ->Envoie donc ton code actuel mais sans les portions de code désactivé stp!

    tu as bien un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(fp,"%d ", a[largeur-i][j]);
    pour le flip vertical et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(fp,"%d ", a[i][longeur-j]);
    pour le flip horizontal? (avec i allant de 0 à largeur-1 et j de 0 à longeur-1).

  8. #8
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 21
    Points : 9
    Points
    9
    Par défaut reboujour
    Et bien tout d'abord merci de bien vouloir regarder pour moi c'est très gentil à vous car j'ai des ptits problèmes! :-( Et bien voilà mon programme comment je l'ai fait pour le moment! Mais j'aimerais mieux avoir une fonction à part du genre

    void Flip_Vertical ( )

    et ensuite l'utiliser dans la fonction main mais cela me crée encore plus de soucis! Oui oui je parle bien de flip et pas de rotation! Je vais aussi devoir faire cela pour mon projet mais ce n'est que pour milieu mai et le flip pour Mardi maintenant qui vient! Je vous montre également ci-joint à quoi ressemble un fichier de petite taille de format .ppm!

    P3 // signifie format .ppm
    3 4 // 3 signifie nombre de lignes et 4 nombre de colonnes
    255 // signifie l'intensité des couleurs
    255 255 255 0 0 0 0 0 0
    127 127 127 127 127 127 127 127 127
    255 0 0 0 255 0 0 0 255
    0 255 255 255 255 0 255 0 255

    Comme vous le voyez dans mon programme là je suis obligé de donner les paramètres de la matrice dans la fonction ce qui n'est pas recommandé! Mais je n'ai pas trouvé le moyen pour qu'il sache le trouver lui meme en lisant le fichier .ppm et reconnaitre le nombre de lignes et colonnes!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    #include <stdio.h>
    void main() {
    	FILE *fp;
    	int i, j,b,temp;
    	int a[324][195];
    	fp=fopen("test.ppm","r");
    	for (i = 1; i < 324; i++)
    		{
    			for (j = 1; j < 195; j++)
    			{
    			fscanf(fp,"%d",&a[i][j]);
     
    		}
    		}
    		fclose(fp);
            fp=fopen("fliphorizontal.ppm","w");
    		fprintf(fp,"P3\n");
    		fprintf(fp,"65 108\n");
    		fprintf(fp,"255\n");
    		for (i = 1; i < 324; i++)
    		/*{if (i == 1)
    		{for (b =5; b < 195; b++)
    		    j=324-i;
    			temp=a[i][b];
    	        a[i][b]=a[j][b];
    	        a[j][b]=temp;
    			fprintf(fp,"%d ", a[i][b]);
    			fprintf(fp,"\n");
    		    fprintf(fp,"%d ", a[j][b]);
    		    fprintf(fp,"\n");}
    		else*/ {for (b =1; b < 195; b++)
    		    {j=324-i;
    			    if (i<j)
    		    {
    			temp=a[i][b];
    	        a[i][b]=a[j][b];
    	        a[j][b]=temp;
    			fprintf(fp,"%d ", a[j][b]);
    			fprintf(fp,"%d ", a[i][b]);}
    	else break;}
    		}
    		fclose(fp);
    		}

  9. #9
    Membre actif
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Points : 268
    Points
    268
    Par défaut
    Citation Envoyé par romain1986
    je n'ai pas trouvé le moyen pour qu'il sache le trouver lui meme en lisant le fichier .ppm et reconnaitre le nombre de lignes et colonnes!
    Citation Envoyé par romain1986
    3 4 // 3 signifie nombre de lignes et 4 nombre de colonnes
    Ai-je besoin de préciser?

    Deux points que je ai déjà soulevé et qu'il va bien falloir que tu traites un jour si tu veux que ton prog marche:

    Si tu as n colonnes et m lignes et que tu lis n-1 colonnes et m-1 lignes tu as un problèmes donc: INITIALISE TES INDICES DE BOUCLES A ZERO!

    Si ton fichier a une entête et que tu commences bille en tête par tout mettre dans ton tableau de data, c'est mal. donc: COMMENCE PAR TRAITER TA PARTIE ENTETE DANS TA LECTURE DU FICHIER! ça sera aussi l'occasion de récupérer la taille du tableau.

    Je ne comprend vraiment ce que tu fabriques avec ta variable temporaire mais une chose et sûre c'est que tu peux t'en passer de la même façon que tu peux te passer de ton break. De plus si tu fais n lectures tu dois faire n écritures alors 2 prints par itération c'est 1 de trop!
    Cherches à faire simple!

    La raison pour laquelle j'insiste sur le fait d'être capable de lire un fichier de le régénérer inchangé est simple: ça veut tout simplement dire que tu maîtrise le format du fichier, les entêtes et les données.
    A partir de là tu peux commencer à faire tes transformations, mais pas avant.

    Une dernière chose, les commentaires sont là pour donner des informations sur ton programme pas pour planquer du code.

    Voici quelques indication pour la structure et les interfaces:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    enum {INDETITY, HFLIP, VFLIP, LROTATION, RROTATION};
     
    int processFile(char * InputFileName, char * OutputFileName,int transfromType){
    int result=0;
    char format[3];
    int width=0;
    int height=0;
    int intensity=0;
    int data[][];
     
    // Interpretation du fichier en entree: Debut
    // Ouverture du fichier
    // Lecture de l'entete: Debut
    // Lecture l'entete: Fin
    // Allocation de la memoire pour les donnees (grace a l'entete)
    // Lecture des donnees: Debut
    // Lecture des donnees: Fin
    // Fermeture du fichier
    // Interpretation du fichier en entree: Fin
     
    // Generation du fichier de sortie: Debut
    // Creation du fichier
    // Ecriture de l'entete: Debut
    // Si INDETITY,HFLIP ou VFLIP alors...
    // Si LROTATION ou RROTATION alors...
    // Ecriture de l'entete: Fin
    // Ecriture des donnees: Debut
    // Si INDETITY alors...
    // Si HFLIP alors...
    // Si VFLIP alors...
    // Si LROTATION alors...
    // Si RROTATION alors...
    // Ecriture des donnees: Fin
    // Fermeture du fichier
    // Generation du fichier de sortie: Fin
     
    // Liberation de la memoire
     
    return result;
    }

Discussions similaires

  1. Fonction flip Vertical pour une matrice
    Par romain1986 dans le forum SDL
    Réponses: 5
    Dernier message: 05/04/2007, 11h17
  2. [JTable] remplir avec une matrice
    Par ybdz dans le forum Composants
    Réponses: 3
    Dernier message: 08/12/2004, 21h03
  3. Recherche des coefficients d'une matrice 3x3
    Par colorid dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 25/11/2004, 16h52
  4. Separateur vertical dans une ListCtrl
    Par jul54 dans le forum MFC
    Réponses: 2
    Dernier message: 15/01/2004, 15h33
  5. Déclarer une matrice
    Par joy dans le forum C
    Réponses: 7
    Dernier message: 09/12/2002, 00h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo