Re Redimensionnement - C - Programmation
Marsh Posté le 14-03-2011 à 16:13:17
Le topic précédent ne te suffisait plus?
Marsh Posté le 15-03-2011 à 08:44:44
Disons c'est plus au clair la je pense !
Pour essayer de résoudre le probléme
Marsh Posté le 15-03-2011 à 11:32:21
Bon, vu que ton code est clair comme du jus de moule, mais que tu as l'air d'avoir bossé, je vais te donner de quoi t'inspirer:
Code :
|
J'ai écrit ça en vitesse, donc j'ai pas tout testé, mais sur une image 2*2 pixels, c'était OK. Ça fait peut être pas exactement ce que tu veux, mais à toi d'adapter ensuite.
Je vais pondre pas mal de commentaires sur ton code précédent dans mon prochain post.
A+,
Marsh Posté le 15-03-2011 à 12:12:32
Merci Gilou !
Mais quand "j'incere" une image dicom 128*128 le programme s'arrete et rien ne ce passe
en tous cas merci je vais essayer de voir tous ça !
Marsh Posté le 15-03-2011 à 12:26:11
Comme j'ai pas d'info sur le format de tes images, ici, ça lit directement un pixmap sauvegardé dans un fichier. Comme je t'ai dit, c'est à adapter a tes besoins. Ca devrait te générer un fichier avec la nom initial suivi de -filtre.dcm en sortie.
Normalement, le programme est fait de manière a ce qu'on aie systématiquement un message d'erreur en cas de pb, et pas de message si l'écriture en sortie du fichier s'est bien passé. Donc si tu as pas de message, tu devrais avoir un fichier écrit au final.
A+,
Marsh Posté le 15-03-2011 à 13:34:41
Je veut bien te croire mais j'ai absoluement rien au final
mais j'essaye de comprendre ton programme !
Marsh Posté le 15-03-2011 à 14:09:35
Bon, sinon, sur ton code:
- On ne met pas un commentaire par ligne, ça rend le code illisible. Un commentaire, ça doit donner une information importante, s'il y a des commentaires partout, ceux qui sont importants sont noyés dans la masse.
De plus, un bon choix des noms de variable rend nombre de commentaires inutiles:
< char information[2048]; /* message à afficher a l'utilisateur */
> char user_info[2048];
- main ne doit pas faire un tas de trucs complexes. Il est la pour découper ton programme en morceaux qui font une tache bien définie
- On sort pas en cours de route avec exit si on peut l'éviter (dans ton cas, des fichiers ouverts ne sont pas fermés en sortant brutalement). On fait des fonctions qui rendent un booleen ou NULL et on teste dans l'appelante, si possible.
- On fait pas faire 2 choses différentes a une fonction: par exemple, la lecture ou bien l'écriture d'une image, mais pas les deux a la fois
Bon sinon, dans le code que je t'ai donné, main n'est pas blindé, je ne vérifie rien sur le bon fonctionnement de scanf (dépassement...)
printf("\rEntrez le nom du fichier image dicom a ouvrir : " );
scanf("%s", buffer);
et
strcat(buffer,"-filtre.dcm" );
Dans un contexte autre que un exemple vite écrit, j'aurais écrit du code qui fait ces vérifications.
Je pense avoir fait les autres vérifications qui s'imposent dans le code.
Je définis un type de donnée correspondant a ce que je vais manipuler, donc un pour l'image et un pour une suite de pixels. C'est une habitude qu'il te faut prendre: regarder quels sont les objets que ton programme va manipuler, et définir des types correspondants.
Je découpe mes fonctions en fonction de ce qu'elles manipulent (ie des fonctions au niveau image et des fonctions au niveau pixmap)
Je fais des fonctions de bas niveau les plus génériques possibles, afin d'éviter d'en réécrire deux dont l'une est une spécialisation de l'autre (ie pas de PIXEL *inflate_proportional_pixmap(...) ici)
l'algo lui même:
PIXEL *pix = inflated;
for (i = 0; i < width; ++i) // chaque ligne
for (j = 0; j < ratiow; ++j) // repetee ratiow fois
for (k = 0; k < length; ++k) // chaque pixel d'une ligne
for (l = 0; l < ratiol; ++l) // repete ratiol fois
*pix++ = pixmap[(i*length)+k];
1) PIXEL *pix = inflated; on se place au début de la pixmap a remplir, qu'on vient d'allouer
2) *pix++ = pixmap[(i*length)+k]; on remplit le pixel de la pixmap (*pix) puis on avance au pixel suivant (pix++) d'ou *pix++
on remplit avec le k-ieme pixel de la ligne i du pixmap de départ (en comptant i et k a partir de 0), pixmap[(i*length)+k];
A+,
Marsh Posté le 15-03-2011 à 15:27:47
Bon, pour la suite, ce qui risque fort de t'intéresser, c'est le type de code suivant:
Code :
|
C'est du code un peu avancé en C: tu as en dernier paramètre (un pointeur sur) une autre fonction qui prend deux PIXELS en parametres et retourne un PIXEL. Bref, une fonction qui fabrique un PIXEL a partir de deux autres.
Exemple:
une fonction de fusion des pixels qui prend un pixel une fois sur deux dans une image et une fois sur deux dans l'autre:
Code :
|
Et tu vas pouvoir appeler ca comme:
Code :
|
ou image1 et image2 sont deux images que tu as déjà construites, et merged est l'image par fusion des deux que tu veux construire (et ensuite écrire dans un fichier ou autre).
Bon ici, la fonction de fusion de pixel, switcher, est stupide, et concrètement quand tu vas vouloir fusionner deux images, (superposition d'une sur l'autre, moyenne des deux pixels, ...) il va falloir que tu en écrives une adaptée a tes besoins (ou plusieurs, si tu as plusieurs type de fusions a effectuer, tout l'intérêt ici, c'est que tu as juste la fonction passée en paramètre a changer, et tu touches pas à merge_image(...)).
A+,
Marsh Posté le 16-03-2011 à 10:55:18
Merci beaucoup !!!
je vais analyser ton code de ce pas !
Merci encore @+
Marsh Posté le 14-03-2011 à 15:32:17
Voila mon code actuelle qui devrait me permetre de modifier une image dicom pour passer d'une taille de 128*128 en 512*512 mais je retrouve mon image d'origine inchangé