Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
|
wiki:tutoriels:processing:entrelacer-deux-images-processing [2021/06/24 09:09] damien.muti créée |
wiki:tutoriels:processing:entrelacer-deux-images-processing [2021/06/24 09:35] (Version actuelle) damien.muti |
||
|---|---|---|---|
| Ligne 7: | Ligne 7: | ||
| * **Fichiers** : | * **Fichiers** : | ||
| * **Liens** : | * **Liens** : | ||
| + | |||
| + | |||
| + | ===== Algorithme ===== | ||
| + | |||
| + | Considérons deux images I1 et I2, de même taille: | ||
| + | |||
| + | I1 : {{ : | ||
| + | |||
| + | I2: {{ : | ||
| + | |||
| + | L' | ||
| + | |||
| + | Ensuite, chaque bande élémentaire est affichée alternativement, | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | ===== Programme ===== | ||
| + | Le code Processing est le suivant : {{ : | ||
| + | |||
| + | < | ||
| + | PImage I1, I2, I3; | ||
| + | int W, H; | ||
| + | int nbEntrelacement = 10; // nombre de " | ||
| + | |||
| + | |||
| + | void setup() { | ||
| + | size(1200, 1800); | ||
| + | I1=loadImage(" | ||
| + | I2=loadImage(" | ||
| + | W=I1.width; | ||
| + | H=I1.height; | ||
| + | // entrelacement images | ||
| + | I3=entrelacer(I1, | ||
| + | } | ||
| + | |||
| + | void draw() { | ||
| + | //image(I1, 0, 0, W/2, H/2); | ||
| + | //image(I2, 0, I1.height/ | ||
| + | image(I3, 0, 0, W, H/2); | ||
| + | } | ||
| + | |||
| + | PImage entrelacer(PImage I1, PImage I2, int N) {// I1 et I2, les deux images; N : nombre de bandes d' | ||
| + | // largeur et hauteur de l' | ||
| + | int W = min(I1.width, | ||
| + | int H = min(I1.height, | ||
| + | // création de l' | ||
| + | PImage I3 = createImage(2*W, | ||
| + | // chargement des tableaux de pixels | ||
| + | I1.loadPixels(); | ||
| + | I2.loadPixels(); | ||
| + | I3.loadPixels(); | ||
| + | |||
| + | // taille des bandes | ||
| + | int L = floor(W/N); | ||
| + | // processus d' | ||
| + | /* n : indice de la bande et L largeur de la bande | ||
| + | pour n=3, indices de I3 pour la bande issue de I1 : de 6*L à 7*L-1, Idem pour I2 : de 7*L à 8*L-1 | ||
| + | pour n=4, indices de I3 pour la bande issue de I1 : de 8*L à 9*L-1, Idem pour I2 : de 9*L à 10*L-1 | ||
| + | ... | ||
| + | pour n=k, indices de I3 pour la bande issue de I1 : de (2*k)*L à (2*k+1)*L-1, | ||
| + | */ | ||
| + | for (int i=0; i<W; i++) { // indice de la ligne dans I1 et I2 | ||
| + | for (int j=0; j<H; j++) {// indice de la colonne dans I1, I2, et I3 | ||
| + | // indice de la colonne atteinte par l' | ||
| + | int n=floor(i/ | ||
| + | // indice du pixel dans la nième colonne | ||
| + | int k=i%L; // reste de la division euclidienne de i par L | ||
| + | |||
| + | I3.pixels[j*I3.width+((2*n*L)+k)]=I1.pixels[j*W+i]; | ||
| + | I3.pixels[j*I3.width+((2*n+1)*L+k)]=I2.pixels[j*W+i]; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // mise à jour des pixels dans l' | ||
| + | I3.updatePixels(); | ||
| + | |||
| + | return I3; | ||
| + | } | ||
| + | |||
| + | /// méthode transformant l' | ||
| + | color[][] imageVector2Matrix(PImage I) { | ||
| + | // création d'une matrice ayant la taille de l' | ||
| + | int W=I.width; | ||
| + | int H =I.height; | ||
| + | color[][] Iprim = new color[W][H]; | ||
| + | for (int i=0; i<W; i++) { | ||
| + | for (int j=0; i<H; i++) { | ||
| + | Iprim[i][j]=I.pixels[j*W+i]; | ||
| + | } | ||
| + | } | ||
| + | return Iprim; | ||
| + | } | ||
| + | |||
| + | /// méthode transformant l' | ||
| + | PImage | ||
| + | // création d'une matrice ayant la taille de l' | ||
| + | int W = Iprim.length; | ||
| + | int H = Iprim[0].length; | ||
| + | PImage I = createImage(W, | ||
| + | for (int i=0; i<W; i++) { | ||
| + | for (int j=0; i<H; i++) { | ||
| + | I.pixels[j*W+i]=Iprim[i][j]; | ||
| + | } | ||
| + | } | ||
| + | return I; | ||
| + | } | ||
| + | |||
| + | void keyPressed(){ | ||
| + | if(key==ENTER){ | ||
| + | save(" | ||
| + | println(" | ||
| + | } | ||
| + | |||
| + | } | ||
| + | </ | ||