Fusionner deux images a l'aide de javascool

Fermé
Marwaaaaaaaaa Messages postés 1 Date d'inscription mardi 1 janvier 2013 Statut Membre Dernière intervention 1 janvier 2013 - 1 janv. 2013 à 16:40
KX Messages postés 16739 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 19 mai 2024 - 1 janv. 2013 à 17:19
Bonjour,
je cherche un moyen de fusionner deux images, j'ai commencé par ceci


int[][][] getImageColorArray() {
int width = getWidth(), height = getHeight(), image[][][] = new int[width][height][3];
for(int y = 0; y < height; y++)
for(int x = 0; x < width; x++)
image[x][y] = getPixelColor(x, y);
return image;}

void main(){
load("D:/ratNB.jpg",false,false);

int [][][] tableau1 = getImageColorArray();
int width1 = getWidth();
int height1 = getHeight();

load("D:/chatNB.jpg",false,false);
int [][][] tableau2 = getImageColorArray();
int width2 = getWidth();
int height2 = getHeight();

int width3 = width1+width2;
int height3;
if (height1>height2){
height3 = height1;
}else{
height3 = height2;
}
int[][][] tableau3 =new int[width3][height3][3];
for (int x = 0 ; x <= width1 ; x ++) {
for ( int y = 0 ; y <= height1 ; y ++ ) {
tableau3[x][y]=tableau1[x][y];}}
for (int x =0 ; x <= width2 ; x ++ ){
for ( int y = 0 ; y <= height2 ; y ++) {
tableau3 [x+width1][y]=tableau2 [x][y];
}
}
}
Mais je ne sais plus comment faire a partir de la. si quelqu'un pourrait me venir en aide, merci d'avance.


A voir également:

1 réponse

KX Messages postés 16739 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 19 mai 2024 3 016
Modifié par KX le 1/01/2013 à 17:40
Je ne connais pas Java's Cool (même si ça m'a l'air bien moche) alors forcément il y a des choses que je ne comprends pas dans ton code, et quelques explications seraient les bienvenues.

Par exemple quand tu fais "load" où est enregistré le résultat ? Comment tu fais le lien entre ce "load" et les getWidth, getHeight, getImageColorArray qu'il y a après ? C'est magique !?

Ensuite TOUTES tes boucles sont fausses, les indices d'un tableau vont de 0 à length-1 donc tout tes <= doivent en fait être des < sinon ça va planter !

Enfin, une fois ton tableau3 obtenu, il te manque l'étape d'enregistrement dans le fichier. Mais comme getPixelColor(x, y) était magique, j'imagine que tu dois aussi avoir un setPixelColor(x,y,rgb) tout aussi magique quelque part...


Je te laisse regarder un code que j'avais déjà fait. C'est du vrai Java à la base, mais j'ai modifié la structure de classe pour que tu puisses le copier-coller tel quel dans Java's School :

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

//public class TraitementImages
//{

/** Sens de concaténation des images. */ 
public enum Sens 
{ 
   /** Les images sont copiées l'une à côté de l'autre */
   Horizontal,        
   /** Les images sont copiées l'une sous l'autre */
   Vertical
}

/**
* Combine deux images en une seule.
* L'image3 sera une combinaison de l'image1 avec (selon le sens) l'image2 à droite ou en dessous.
* Enregistre l'image avec conservation de la transparence (TYPE_INT_ARGB) selon l'extension du fichier.
* @param image1 le premier fichier image
* @param image2 le deuxième fichier image
* @param image3 le fichier image résultat, son extension définit le type de l'image (png, jpg...)
* @param sens le mode de concaténation
* @param espacement taille à respecter entre les deux images
* @param defaut couleur à utiliser pour l'espace entre les images (et pour les marges si les tailles d'images sont différentes)
* @throws IOException 
*/
public static void combiner(File image1, File image2, File image3, Sens sens, int espacement, Color defaut) throws IOException
{
   BufferedImage img1 = ImageIO.read(image1);
   BufferedImage img2 = ImageIO.read(image2);
   
   int rgb_defaut = defaut.getRGB();
   
   int w=0, h=0,
       w1=img1.getWidth(), h1=img1.getHeight(),
       h2=img2.getHeight(),w2=img2.getWidth(),
       x2=0,y2=0,             // coin gauche de img2;
       x3=0,y3=0,x4=0,y4=0,   // coins gauche et droite de l'espace à rajouter si les taille sont différentes
       x5=0, y5=0, x6=0, y6=0;// coins gauche et droite de la ligne d'espacement
   
   switch (sens)
   {
   case Horizontal:
       w=w1+espacement+w2;
       h=Math.max(h1,h2);
       x2=w1+espacement;
       y2=0;
       
       if (h1>h2)
       {
           x3=w1+espacement;
           y3=h2;
           x4=x3+w2;
           y4=h1;
       }
       else
       {
           x3=0;
           y3=h1;
           x4=w1;
           y4=h2;
       }
       
       x5=w1; y5=0;
       x6=w1+espacement; y6=h;
       
       break;
   
   case Vertical:
       w=Math.max(w1,w2);
       h=h1+espacement+h2;
       x2=0;
       y2=h1+espacement;
       
       if (w1>w2)
       {
           x3=w2;
           y3=h1+espacement;
           x4=w1;
           y4=y3+h2;
       }
       else
       {
           x3=w1;
           y3=0;
           x4=w2;
           y4=h1;
       }
       
       x5=0; y5=h1;
       x6=w; y6=h1+espacement;            
       
       break;
   }
   
   BufferedImage img3 = new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB);
   
   for (int x=0; x<w1; x++)
   for (int y=0; y<h1; y++)
       img3.setRGB(x, y, img1.getRGB(x,y));
   
   for (int x=0, x_=x2; x<w2; x++, x_++)
   for (int y=0, y_=y2; y<h2; y++, y_++)
       img3.setRGB(x_, y_, img2.getRGB(x,y));
   
   for (int x=x3; x<x4; x++)
   for (int y=y3; y<y4; y++)
       img3.setRGB(x, y, rgb_defaut);
   
   for (int x=x5; x<x6; x++)
   for (int y=y5; y<y6; y++)
       img3.setRGB(x, y, rgb_defaut);
   
   ImageIO.write(img3, image3.getName().substring(image3.getName().indexOf(".")+1), image3);
}

/*public static*/ void main() throws IOException
{
    combiner(new File("C:/img1.png"),new File("C:/img2.png"),new File("C:/img3.png"),Sens.Horizontal,0,Color.BLACK);
}
//}
La confiance n'exclut pas le contrôle
0