Exemple 5 : combiner deux fonctions pour tramer des images

Ce script reprend le script précédent et l’associe avec un script de tramage de l’image. Sur cette base, des expérimentations peuvent être faites tout en gardant le contrôle sur le résultat.

Précédent | 10/15 | Suivant

Une fonction dans une fonction

La fonction écrite dans le script précédent permettait de prélever une portion d’image àune taille choisie. Nous allons la combiner àun script de tramage, ce qui permettra de créer des patterns et des mise en pages plus intéressantes.

L’idée du script est de :
 prélever une portion d’image d’une taille choisie
 l’analyser pour en faire une version plus grossière
 afficher cette trame àun endroit choisi

Il y a donc 7 arguments àenvoyer àla fonction :
 le nom de l’image
 la coordonnée où afficher le résultat sur l’axe horizontal
 la coordonnée où afficher le résultat sur l’axe vertical
 la largeur de la portion en pixels
 la hauteur de la portion en pixels
Plus :
 la taille des samples en largeur
 la taille des samples en hauteur
Ça commence àfaire beaucoup, mais ça vaut le coup

Voici cette fonction (qui s’ajoute donc àcelle déjàécrite dans le tutoriel précédent) :

// image sample place une grille downsamplée
void image_sample(String source, int x, int y, int largeur, int hauteur,int pixx, int pixy) {
  noStroke(); // retirer le filet au cas où
  
  // la fonction get_sample renvoie un recadrage de l'image dans le format demandé
  PImage sample=get_sample(source, largeur, hauteur);

  pushMatrix();
  translate(x, y);
  // dessiner la grille avec un double boucle
  for (float gx=0; gx<=sample.width; gx+=pixx) {
    for (float gy=0; gy<=sample.height; gy+=pixy) {
      color c=sample.get(int(gx), int(gy));
      // faire quelque chose avec la couleur ici
      fill(c);
      rect(gx,gy,pixx,pixy);
    }
  }
  popMatrix();
}

Cette fonction utilise pushMatrix, popMatrix() et translate(), trois fonctions liées, que je ne décris pas maintenant.

Après avoir créé l’image recardée avec la fonction get_sample(), l’image est analysée avec une double boucle et dans ce prermier exemple, on obtient une image tramée grossièrement :

On dispose de tous les arguments de la fonction pour fabriquer des images différentes : position dans l’espace, taille de la trame, etc.

Modifier le coeur de la fonction

Mais on peut aussi modifier des parties de la fonction, et la partie centrale de celle-ci est l’intérieur de la double boucle.
On peut ainsi remplacer

    fill(c);
    rect(gx,gy,pixx,pixy);
  

par :

    
    stroke(c);
    strokeWeight(1);
    line(gx,gy+pixy/2,gx+pixx,gy+pixy/2);

et obtenir ceci

ou encore

    stroke(c);
    strokeWeight(1);
    line(gx,gy+pixy/2,gx+pixx,gy+pixy/2);
    line(gx+pixx/2,gy,gx+pixx/2,gy+pixy);

ou encore

fill(c);
      ellipse(gx+pixx/2,gy+pixy/2,pixx*0.8,pixy*0.8);

Assembler les codes

En combinant le code de base, le choix de la portion, de la position et de la trame, on peut générer des couvertures intéressantes :