gilou Modérateur Modosaurus Rex | 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 :
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdbool.h>
- #include <math.h>
- typedef short int PIXEL;
- typedef struct {
- int width;
- int length;
- PIXEL *pixmap;
- } IMAGE;
- /* Lecture ecriture d'une image */
- bool lecture_image(char *filename, IMAGE *image);
- bool ecriture_image(char *filename, IMAGE image);
- /* manipulation de l'image */
- IMAGE inflate_image(IMAGE image, int ratiol, int ratiow);
- IMAGE inflate_proportional_image(IMAGE image, int ratio);
- /* manipulation des pixmaps d'une image */
- PIXEL *inflate_pixmap(PIXEL *pixmap, int length, int width, int ratiol, int ratiow);
- /* fonction ad hoc pour l'exemple */
- static bool getdims(long size, int *length, int *width);
- #define BUFFER_SIZE 256
- #define RATIO 4
- /* 1) recuperation du nom de fichier
- 2) lecture du fichier et creation de l'image en memoire
- 3) creation de l'image zoomee en memoire
- 4) ecriture de l'image zoomee
- */
- int main(int argc, char *argv[])
- {
- char buffer[BUFFER_SIZE];
- IMAGE image, inflated;
- int length, width;
- int retcode = EXIT_FAILURE;
-
- printf("\rEntrez le nom du fichier image dicom a ouvrir : " );
- scanf("%s", buffer);
- if (lecture_image(buffer, &image)) {
- inflated = inflate_proportional_image(image, RATIO);
- if (inflated.pixmap) {
- strcat(buffer,"-filtre.dcm" );
- if (ecriture_image(buffer, inflated)) {
- retcode = EXIT_SUCCESS;
- }
- free(inflated.pixmap);
- }
- free(image.pixmap);
- }
- return retcode;
- }
- /* lit un fichier et cree l'image en mémoire */
- /* 1) Ouverture du fichier
- 2) lecture des infos du header
- 3) allocation du pixmap
- 4) lecture du pixmap
- 5) fermeture du fichier */
- bool lecture_image(char *filename, IMAGE *image) {
- FILE *file;
- bool retcode = false;
- file = fopen(filename,"rb" );
- if (!file) {
- fprintf(stderr, "Erreur : le fichier %s n'est pas lisible dans le repertoire courant\n", filename);
- }
- else {
- /* normalement ici, on devrait lire les dimensions dans l'en tête, sauter l'en tête jusqu'a l'image, et lire l'image
- mais bon, comme ton code a une procédure simplifiée, je la suis, et je deduis les dimensions de l'image
- a partir de sa taille. Ca ne paut marcher que pour une image carrée */
- long filesize;
- fseek(file, 0L, SEEK_END);
- filesize = ftell(file);
- filesize /= sizeof(PIXEL);
- if (getdims(filesize, &(image->length), &(image->width))) {
- fseek(file, 0L, SEEK_SET);
- image->pixmap = malloc((image->length) * (image->width) * sizeof(PIXEL));
- if (!image->pixmap) {
- fprintf(stderr, "Erreur : Allocation du fichier image impossible lors de la lecture de %s\n", filename);
- }
- else {
- size_t read = fread(image->pixmap, sizeof(PIXEL), (image->length) * (image->width), file);
- if ((!read) || (read != ((image->length) * (image->width)))) {
- fprintf(stderr, "Erreur : Lecture du fichier %s incorrecte\n", filename);
- free(image->pixmap);
- }
- else {
- retcode = true;
- }
- }
- }
- fclose(file);
- }
- return retcode;
- }
- /* ecrit une image en memoire dans un fichier */
- /* 1) ouverture du fichier
- 2) ecriture du header
- 3) ecriture du pixmap
- 4) fermeture du fichier
- */
- bool ecriture_image(char *filename, IMAGE image) {
- FILE *file;
- bool retcode = false;
- file = fopen(filename,"wb" );
- if (!file) {
- fprintf(stderr, "Erreur : le fichier %s n'est pas lisible dans le repertoire courant\n", filename);
- }
- else {
- /* normalement ici, on devrait écrire l'en tête de l'image, avec ses dimensions, puis ecrire le pixmap
- mais bon, comme ton code a une procédure simplifiée, on va se contenter d'écrire le pixmap */
- size_t written = fwrite(image.pixmap, sizeof(PIXEL), image.length * image.width, file);
- if ((!written) || (written != (image.length * image.width))) {
- fprintf(stderr, "Erreur : Ecriture du fichier %s incorrecte\n", filename);
- }
- else {
- retcode = true;
- }
- fclose(file);
- }
- return retcode;
- }
- /* bon, c'est un exemple ou on deduit la taille d'une image carrée */
- /* en général, les dimensions se recupèrent dans le header */
- /* calcul par la racine carrée et verification que ça tombait juste */
- bool getdims(long size, int *length, int *width) {
- bool retcode = true;
- *length = *width = sqrt(size);
- if (size != (*length)*(*width)) {
- fprintf(stderr, "Erreur : calcul de dimension errone\n" ); // pas carre
- *length = *width = 0;
- retcode = false;
- }
- return retcode;
- }
- /* renvoit une image avec des facteurs de zoom en longueur et largeur */
- IMAGE inflate_image(IMAGE image, int ratiol, int ratiow) {
- IMAGE inflated;
- inflated.width = (image.width) * ratiow;
- inflated.length = (image.length) * ratiol;
- inflated.pixmap = inflate_pixmap(image.pixmap, image.length, image.width, ratiol, ratiow);
- return inflated;
- }
- /* renvoit une image avec un unique facteur de zoom */
- IMAGE inflate_proportional_image(IMAGE image, int ratio) {
- return inflate_image(image, ratio, ratio);
- }
- /* Fonctions sur les pixmaps.
- Ces fonctions supposent que les valeurs length et width sont correctes
- par rapport aux dimensions du pixmap
- C'est une précondition à leur emploi */
- /* renvoit une pixmap zoom du pixmap initial, avec des facteurs de zoom en longueur et largeur */
- PIXEL *inflate_pixmap(PIXEL *pixmap, int length, int width, int ratiol, int ratiow) {
- PIXEL *inflated = NULL;
- inflated = malloc(length * ratiol * width * ratiow * sizeof(PIXEL));
- if (!inflated) {
- fprintf(stderr, "Erreur : Allocation du fichier agrandi impossible\n" );
- }
- else {
- int i, j, k, l;
- 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];
- }
- return inflated;
- }
- /* on peut faire diverses operations sur les images selon ses besoins
- en définissant une opération au niveau image, puis une au niveau pixmap
- qui fait l'essentiel du boulot */
|
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+, ---------------
There's more than what can be linked! -- Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻
|