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 :