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 :