Resize image [Urgent !] [Résolu]

Messages postés
112
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
13 juin 2010
- - Dernière réponse : The Red Man
Messages postés
112
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
13 juin 2010
- 16 déc. 2008 à 12:54
Bonjour,

Est-ce que vous avez une idée de l'algo (enfin le code :D) en C qui donnerait la possibilité de réduire ou agrandir une image !

Merci !
Afficher la suite 

9 réponses

Meilleure réponse
Messages postés
112
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
13 juin 2010
2
3
Merci
Avec un peu de recherche, Je me suis rendu compte que finalement je pouvais utiliser l'algèbre bilinéaire à la fois pour la modification de la résolution de l'image mais aussi pour des filtres.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 188 internautes nous ont dit merci ce mois-ci

Commenter la réponse de The Red Man
Messages postés
14636
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
9 octobre 2019
90
0
Merci
Yep, bien sûr:
Réduction = moyenne des pixels voisins
Agrandissement = interpolation
Jettes un oeil sur ma source

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Commenter la réponse de BunoCS
Messages postés
112
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
13 juin 2010
2
0
Merci
Salut !

Sur ta source il n'y a pas de fonction pour modifier la taille de l'image. De plus avec un tableau à 2 dimensions c'est simple. Mais lorsque tu doit gérer un tableau à une dimension c'est un plus chaud par exemple lorsque tu veux agrandir sur la longueur et la hauteur.

voici la structure :

typdef struct Timage
{
  int w;
  int h;
  unsigned char * data;
} Timage;
Commenter la réponse de The Red Man
Messages postés
14636
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
9 octobre 2019
90
0
Merci
Sur ta source il n'y a pas de fonction pour modifier la taille de l'image

-> ah oups, sorry...Je me sens c** du coup

un tableau à une dimension c'est un plus chaud
-> bof. Si tu connais la hauteur et la largeur de ton image, aucun souci.
Au lieu d'accéder à un pixel comme ça:  bitmap[i][j], tu dois faire bitmap[i*largeur+j].
ça allonge l'écriture, certes, mais le traitement est le même

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Commenter la réponse de BunoCS
Messages postés
112
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
13 juin 2010
2
0
Merci
Je teste ça et je verrai !

Merci bien ;)
Commenter la réponse de The Red Man
Messages postés
112
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
13 juin 2010
2
0
Merci
le truc c'est que lors de l'agrandissement de l'image, je fonctionne par coefficient d'agrandissement.
Exemple : coeffW = newWidth/oldWidth;
le problème c'est que le coeffW correspondra parfois à une valeur à virgule flottante donc pour l'interpolation des pixel reste difficile.

tu vois ce que je veux dire ou pas ? :D
Commenter la réponse de The Red Man
Messages postés
14636
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
9 octobre 2019
90
0
Merci
Hello,
Désolé, je ne vois pas ce que tu veux dire. Pourrais-tu être plus précis, s'il te plaît?

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Commenter la réponse de BunoCS
Messages postés
112
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
13 juin 2010
2
0
Merci
Voilà une fonction permettant de modifier la résolution d'une image :
/**
   * Resize jpg file
   *
   * @params
   *    Timage image - current image to edit
   *    int height - new height
   *    int width - new width
   */
int resize(Timage image, unsigned int height, unsigned int width)
{
    /* if the image is not exist  this function will return -1 as error value */
    if (image == NULL) return -1;
   
    /* on test si les les nouvelles dim. sont similaire au anciennes dim. */    if (image->h height && image->w width) return 1;

    int x,y, * xarray;
    unsigned char  ** yarray, *ptr, *ptr2, *ptr22;
    unsigned char * new_data = (unsigned char *)malloc(height * width * 3 * sizeof(unsigned char *));
    int l,  r, m, pos, inc, w3;
   
    /* verify new_data */
    if (!new_data)
    {
        printf("Erreur d'allocation de l'image\n");
        return -1;
    }

    /* verify xarray */

     xarray = (int *)malloc(sizeof(int) * width);   
    if (!xarray)
    {
        printf("Erreur d'allocation de l'image de coord. X\n");
        return -1;
    }
   
    /* verify yarray */
    yarray = (unsigned char **)malloc(sizeof(unsigned char *) * height);     
    if (!yarray)
    {
        printf("Erreur d'allocation de l'image de coord. Y\n");
        /* on libere la memoire non utilisé */
        free(new_data);
        free(xarray);
        return -1;

    }

  ptr22 = image->data;

  w3 = image->w * 3;

  inc = 0;

  l = 0;

  r = 0;

  m = width - l - r;

   
  /* décalage binaire de 16 byte */

  inc = (image->w << 16) / m;
 
  /* position 0 */

  pos = 0;

 
  /* on parcourt d'abord tous les valeurs de coordonnées x */

  for (x = l; x < l + m; x++) {
 
    /* */

    xarray[x] = (pos >> 16) + (pos >> 16) + (pos >> 16);
   
    /* incrementation de la position  */

    pos += inc;

  }

 
  pos = (image->w - r) << 16;

  for (x = width - r; x < width; x++) {

    xarray[x] = (pos >> 16) + (pos >> 16) + (pos >> 16);

    pos ++;

  }

 
  l = 0;

  r = 0;

  m = height - l - r;

 
  if (m > 0)

    inc = (image->h << 16) / m;

 
  pos = 0;

 
  for (x = l; x < l + m; x++) {

    yarray[x] = ptr22 + ((pos >> 16) * w3);

    pos += inc;

  }

 
  pos = (image->h - r) << 16;

  for (x = height - r; x < height; x++) {

    yarray[x] = ptr22 + ((pos >> 16) * w3);

    pos ++;

  }

 
  ptr = new_data;

  for (y = 0; y < height; y++) {

    for (x = 0; x < width; x++) {

      ptr2 = yarray[y] + xarray[x];

      *ptr++ = (int)*ptr2++;

      *ptr++ = (int)*ptr2++;

      *ptr++ = (int)*ptr2;

    }

  }

   
    image->h = height;
    image->w = width;
    image->data = new_data;
   
    /* on libere la mémoire */
    free(xarray);
    free(yarray);
   
       
    return 1;
}
Commenter la réponse de The Red Man
Messages postés
112
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
13 juin 2010
2
0
Merci
je rappel que je me suis aidé d'un autre algo.
Commenter la réponse de The Red Man