1

Bonjour,

je vous explique mon problème. En gros en ouvrant puis sauvegardant et affichant une image au format ppm je me suis aperçu qu'il y avait une légère différence de couleur et cela fait plusieurs heures que je planche dessus et je ne vois pas d'où vient l'erreur.

D'abord voila l'image originale :

[URL=http://img252.imageshack.us/my.php?image=img10um0.jpg][IMG]http://img252.imageshack.us/img252/217/img10um0.th.jpg[/IMG][/URL]

Puis l'image que j'obtiens après l'avoir ouverte et sauvegardée juste après avec les fonctions que j'ai faite :

[URL=http://img392.imageshack.us/my.php?image=testge2.jpg][IMG]http://img392.imageshack.us/img392/7157/testge2.th.jpg[/IMG][/URL]

Comme vous pouvez le voir il y a des différences de teintes...Au début je pensais avoir inversé une des composantes de couleurs avec une autre mais en faisant des petits tests rapides (créet juste une image toute verte par exemple je me suis aperçu que ce n'était pas ça). Donc voilà si quelqu'un a le temps et souhaite m'aider qu'il soit le bienvenu :

Fonctions utilisées :


inline void ppm_trace(char *function, char *error, char* msg){
printf("[ppm | %s Trace] :: %s (%s)\n", function, error, msg);
exit(1);
}




void ppm_load(char *file_name, float*** matrix_r, float*** matrix_g, float*** matrix_b, int *length, int *width){
FILE *file;
char log[200];
int depth, i,j;
unsigned char color;

file=fopen(file_name, "r");
if(file == NULL)
ppm_trace("ppm_load", "Cannot open file", file_name);

fgets(log, 4, file);
if(strcmp(log, "P6\n"))
ppm_trace("ppm_load", "Bad ppm format", "NOT P6");

fgets(log, 200, file); // Jump GIMP comment (no support of multiline comments)

fscanf(file, "%d %d", width, length);
fscanf(file, "%d", &depth);

*matrix_r = fmatrix_allocate_2d(*length, *width);
*matrix_g = fmatrix_allocate_2d(*length, *width);
*matrix_b = fmatrix_allocate_2d(*length, *width);

for(i=0;i<*length;i++)
for(j=0;j<*width;j++)
{
fread(&color,1,1,file);
(*matrix_r)[i][j] = (float)color;
fread(&color,1,1,file);
(*matrix_g)[i][j] = (float)color;
fread(&color,1,1,file);
(*matrix_b)[i][j] = (float)color;
}
fclose(file);
}




void ppm_save(char* file_name, float **matrix_r, float **matrix_g, float **matrix_b, int length, int width){
FILE *file;
int i, j;

file = fopen(file_name, "w");
if(file == NULL)
ppm_trace("ppm_save", "Cannot open file", file_name);

fprintf(file, "P6\n");
fprintf(file, "# Img generated by ppm_save\n");
fprintf(file, "%d %d\n", width, length);
fprintf(file, "255\n");

for(i=0;i<length;i++)
for(j=0;j<width;j++){
fprintf(file, "%c%c%c", (char)matrix_r[i][j], (char)matrix_g[i][j], (char)matrix_b[i][j]);
}
fclose(file);
}




void ppm_display(char *file_name){
char *tmp = (char*)malloc(sizeof("display &") + strlen(file_name));
if(!tmp)
ppm_trace("ppm_display", "Cannot allocate memory", "NULL");
sprintf(tmp, "display %s&", file_name);
system(tmp);
free(tmp);
}




Et le la fonction principale :


int main(int argc, char** argv)
{
float **matrix_r, **matrix_g, **matrix_b;
int length,width;

ppm_load("img10.ppm",&matrix_r, &matrix_g, &matrix_b, &length, &width);
ppm_save("test.ppm", matrix_r, matrix_g, matrix_b, length, width);
ppm_display("test.ppm");



return 0;
}


Voilà je ne vous demande pas de compiler etc mais si quelqu'un a une idée n'hésitez pas smile

Merci

2

sans regarder le code, je dirais que ca peut venir d'une erreur de type (genre un overflow quelque part lorsque tu lis les couleurs).

3

sans regarder le code non plus je penche plutôt pour un décalage au niveau des octets (i.e. l'image 1 pourrait être r1-g1-b1-r2-g2-b2-... et l'image 2 g1-b1-r2-g2-b2-r3-...)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

4

5

Limanus, pourquoi stocker les char dans des float ?

Tu peux nous montrer ce que ça fait sur une image plus colorée ?
avatar

6

Pollux (./3) :
sans regarder le code non plus je penche plutôt pour un décalage au niveau des octets (i.e. l'image 1 pourrait être r1-g1-b1-r2-g2-b2-... et l'image 2 g1-b1-r2-g2-b2-r3-...)


Exact!

J'ai finalement vu d'ou venait l'erreur.
Il fallait en effet mettre fscanf(file, "%d\n", &depth); et non pas fscanf(file, "%d", &depth);
D'ou le decalage....
On va dire que j'apprends dans le metier et que cette erreur etait evitable couic

Merci a tous

7

Bon au lieu d'ouvrir un nouveau topic pour pas grand chose j'ne profite pour poser une autre question qui n'a pas de rapport.

En gros je voudrais savoir si il était possible de faire une commande sous linux qui permette de compter le nombre de fichiers contenus dans un répertoire et de mettre cette commande directement dans mon programme en C.

Je m'explique, mettons que je veuille compter le nombre de fichiers contenus dans /home/truc/ et que je fasse un simple:

int nombre;

Est-ce possible de faire un truc du genre : nombre = system("la fameuse commande") ou un truc comme ça ?

Voila j'ai vu qu'il existait la commande wc qui permet de compter des trucs comme le nombre d'octets, de lignes d'un fichier etc mais je ne vois pas trop comment l'utiliser pour mon problème. Donc une fois de plus si quelqu'un a une idée smile

Merci beaucoup

8

non, c'est plus compliqué que ça parce que le nombre renvoyé par system() a une capacité limitée (par exemple 255 maximum) -- si tu veux passer par des commandes unix genre "wc -l" pour compter le nb de lignes, il faut que tu te débrouilles pour lire le nombre qu'écrira wc sur stdout ; tu peux soit passer par un fichier temporaire (beurk), soit passer par fork+exec...

et puis quoi qu'il arrive ça sera nettement moins performant que si tu parcours le répertoire toi-même avec http://en.wikipedia.org/wiki/dirent.h ^^

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

9

merci pollux, je vais voir ca et je te tiens au courant

10

Oui, et à mon avis si tu tapes "nombre fichiers répertoire dirent" sur gougueule, tu devrais trouver un code tout fait rapidement grin
ps: je trouve ton pseudo magnifique et extrèmement subtil happy
avatar
fabetal_ > Hier, je me suis fait monter par un pote
redangel > et en chevals, ça donne quoi?
Nil> OMG I think I'm gay