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(" | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ |