Les habitués de ce blog savent que la Joconde a toujours été pour J... une sorte de référence qu'il se complait à massacrer à chaque fois qu'il écrit un code pour déformer des images. Hé bien,
voila, ça recommence ! Voici une petite série de la Joconde passée à l'algorithme d'une déformation du plan vers lui-même, RxR vers RxR quoi... Soyez rassurés, elle n'a pas souffert, il ne s'agit
que de sinus et de cosinus. D'autres séries suivront et elles seront plus violentes.
Pour les plus curieux, ces déformations ont été faites avec Processing et le code est en bas.
Donc, voici pour le plus intéressés, le code qui a servi à cela. Bien sûr, Over-blog ne propose aucun outil de mise en ligne de code, donc la mise page reste sommaire...
PImage b;
int i, j, sx, sy, loc,ii ,jj, numsequence, numeroimage;
float rouge1, vert1, bleu1,x,y,t;
void setup(){
b = loadImage("joconde_nettoyee.jpg");
size(b.width, b.height); // dimensions
sx = width; // variable définissant la largeur
sy = height; // -- et la hauteur de l'espace de jeu
background(0,0,0);
t=0;
numeroimage=1;
numsequence=int(random(1,1000));
}
void draw(){
t=t+1;
for (int ii = 0; ii < sx; ii=ii+1) {
for (int jj = 0; jj < sy; jj=jj+1) {
// le point actuel à recalculer est (ii,jj)
// on recalcule les coordonnées x,y après la transformation dans l'image d'origine
// VOICI LA TRANSFORMATION qu'il faut changer pour obtenir d'autres effets.
x=ii + 185*cos(0.08*ii+t) *sin(0.02*ii+t) *sin(ii*PI/sx);
y=jj + 185*sin(0.08*jj+t) *sin(0.02*jj+t) *sin(jj*PI/sy);
//-------------------------------------------------------------
// on applique le modulo pour être sur de retomber dans l'image
x=(sx-1+x)%(sx-1);
y=(sy-1+y)%(sy-1);
// (j,i) (lig col) position d'un pixel dans la'image d'origine
i=int(x); // colonne
j=int(y); // ligne
// on récupère la couleur d'origine
loc = int(int(i) + int(j)*sx); // loc est le numéro du pixel dans l'image
rouge1 = red(b.pixels[loc]);
vert1 = green(b.pixels[loc]);
bleu1 = blue(b.pixels[loc]);
stroke(rouge1, vert1, bleu1);
fill(rouge1, vert1, bleu1);
point(ii,jj);
}
}
filter(BLUR);
}
void mousePressed() {
saveFrame("deformation_image-" + numsequence + "-" + numeroimage + ".jpg");
println("PHOTO "+ numsequence + " - " + + numeroimage );
numeroimage=numeroimage+1;
}