IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Assemblage de plusieurs images vers une image


Sujet :

Langage Java

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2012
    Messages : 9
    Par défaut Assemblage de plusieurs images vers une image
    Bonjour tout le monde,

    Dans le cadre de mes études, je suis sur un projet java et je suis complètement bloqué...


    Je souhaite réaliser un programme simple permettant de :
    1. récupérer et stocker 8 images déjà existantes (sous format jpeg) et de tailles identiques (512x512)
    2. créer et sauvegarder une nouvelle image de taille (2048x1024) qui est un assemblage de ces images (2 lignes, 4 colonnes)

    Un problème expliqué clairement est un problème à moitié résolu :
    • je ne sais pas quel classe utiliser parmis Image, ImageIcon, ImageIO, BufferedImage...
    • doit-on obligatoirement utiliser une fonction graphique (exemple : Graphics2D) ?

    PS 1: je n'ai pas besoin de l'afficher dans une JFrame/JPanel.
    PS 2: les 8 images ont déjà été enregistrées.

    J'ai déjà cherché pas mal de temps sur ce site et avec l'aide de mon ami google, mais j'ai seulement réussi à afficher un assemblage de 2 images dans une JFrame

    Merci à ceux qui voudront bien se pencher sur mon problème
    Bonne journée !

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2012
    Messages : 9
    Par défaut
    J'ai trouvé ma réponse !


    1. L'utilisation du " Graphics2D" est nécessaire pour fabriquer la nouvelle image.

    2. Simple problème de conversion :
    > acquérir vos images sous des ImageIcon
    > faire votre assemblage (en restant en ImageIcon)
    > convertir l'assemblage vers un BufferedImage
    > enregistrer votre BufferedImage via ImageIO.write(votre image finale)

    Je vous prie de m'excuser !

    PS : pour les curieux, je peux vous montrer mon code

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2012
    Messages : 9
    Par défaut Re
    Bonjour, c'est encore moi ...

    Mon programme fonctionne pour des tailles de fichier JPEG tel que 39Ko ou 100Ko.
    (Dimension 512x512, Profondeur de couleur 24 bits, et résolution H/V 96dpi)

    Cependant, il ne fonctionne plus des tailles de fichier JPEG tel que 768Ko.
    (Dimension 512x512, Profondeur de couleur 24 bits, et résolution H/V 300dpi)

    D'après le message d'erreur, l'acquisition via ImageIcon pose problème car il me crée un objet ImageIcon de Hauteur et de Largeur négatif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Exception in thread "main" java.lang.IllegalArgumentException: Width (-2) and height (-1) must be > 0
    	at java.awt.image.SampleModel.<init>(Unknown Source)
    	at java.awt.image.ComponentSampleModel.<init>(Unknown Source)
    	at java.awt.image.PixelInterleavedSampleModel.<init>(Unknown Source)
    	at java.awt.image.Raster.createInterleavedRaster(Unknown Source)
    	at java.awt.image.Raster.createInterleavedRaster(Unknown Source)
    	at java.awt.image.BufferedImage.<init>(Unknown Source)
    	at lol.append(lol.java:27)
    	at lol.main(lol.java:40)
    Quelqu'un pourrait m'orienter vers la résolution de ce problème ?
    Voici mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
     
     
    public class lol {
     
    	// ASSEMBLAGE des deux images
        public static Image append(Image img1, Image img2) {
            BufferedImage buf = null;
            if(img1 != null && img2 != null) {
                int w1 = img1.getWidth(null);
                int h1 = img1.getHeight(null);
                int w2 = img2.getWidth(null);
                int h2 = img2.getHeight(null);
                int hMax = 0;
                int wMax = 0;
          // hMax = h1 si h1>=h2  sinon hMax = h2
                hMax = (h1 >= h2) ? h1 : h2;
                wMax = w1+w2;
                buf = new BufferedImage(wMax, hMax, BufferedImage.TYPE_3BYTE_BGR); // ligne 27
                Graphics2D g2 = buf.createGraphics();
                g2.drawImage(img1, 0, 0, null);
                g2.drawImage(img2, w1, 0, null);
            }
            return buf;
        }
     
        public static void main(String[] args) throws InterruptedException {
     
            ImageIcon img1 = new ImageIcon("x0y0b.jpg");
            ImageIcon img2 = new ImageIcon("x0y1b.jpg");
     
            ImageIcon image = new ImageIcon(append(img1.getImage(), img2.getImage())); // ligne 40
     
            ImageToFile(image, "assemblage.jpg");
     
        }
     
     // CONVERSION de votre ImageIcon en BufferedImage et enregistrement
        private static void ImageToFile(ImageIcon i, String file)   {
            BufferedImage output=ImageIconToBufferedImage(i.getImage());
        File fic= new File(file);
        try {
    		ImageIO.write(output, "jpg", fic);
    	} catch (IOException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
     
        }
     
        // CONVERSION de votre ImageIcon en BufferedImage
        private static BufferedImage ImageIconToBufferedImage(Image image) {
            image = new ImageIcon(image).getImage();    
            BufferedImage bufferedImage = new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB );
            Graphics g = bufferedImage.createGraphics();
            g.drawImage(image,0,0,null);
            g.dispose();
            return( bufferedImage );
                }
    }

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2012
    Messages : 9
    Par défaut Re :
    Encore moi

    J'ai trouvé la solution. Aucun rapport avec le code ci-dessus.
    Le problème venait de ma fonction d'enregistrement des Images :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    import java.awt.image.BufferedImage;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
     
    import javax.imageio.ImageIO;
     
    public class SaveImage {
        public SaveImage(String path, String nom) {
         try {
          URL adresse=new URL(path);
          URLConnection con = adresse.openConnection();
          BufferedImage im =ImageIO.read(con.getInputStream());
          String[] extension=ImageIO.getReaderFormatNames();
          FileOutputStream img= new FileOutputStream(nom);
          ImageIO.write(im, extension[1], img);
         } catch (MalformedURLException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
         } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
         }
        }
        }
    J'ai remplacé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImageIO.write(im, extension[1], img);
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImageIO.write(im, extension[0], img);
    Ce qui change la taille des fichiers enregistrés.
    Je passe donc à des fichiers jpg de taille 9-30Ko.
    Et ma routine située plus haut fonctionne "al dente", même lorsque je l'utilise avec 18 blocs d'images

    En espérant que mon mono-dialogue aidera certaines personnes.

    Cameleon59

    PS : dois-je en conclure une limite de taille de fichier pour l'utilisation de ImageIcon ?

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Tout cela est bien compliqué...

    Pour commencer je ne travaillerais qu'avec des BufferedImage, que je lirais tous avec ImageIO.read().

    Je créerais aussi dès le début un BufferedImage de la taille de l'image finale.
    Puis, j'y mettrais les images les unes après les autres, au bon endroit (effectivement, avec Graphics2D.drawImage().)

    Enfin enregistrer cette image finale avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImageIO.write(bufferedImage, "JPEG", resultImageFile);
    Pourquoi aller chercher une liste d'extensions alors que de toute façon on veut enregistrer en JPEG ?

    PS : dois-je en conclure une limite de taille de fichier pour l'utilisation de ImageIcon ?
    Forcément oui, mais on ne s'approche sans doute pas de cette limite.

    Par contre, ImageIcon ne doit pas beaucoup aimer qu'on lui donne à lire un fichier GIF ou PNG dont l'extension est .jpeg.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2012
    Messages : 9
    Par défaut
    Merci pour m'avoir répondu thelvin.

    Enfin enregistrer cette image finale avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImageIO.write(bufferedImage, "JPEG", resultImageFile);
    Je suis trop bête, tu m'as achevé sur les extensions

    Par contre, ImageIcon ne doit pas beaucoup aimer qu'on lui donne à lire un fichier GIF ou PNG dont l'extension est .jpeg.
    D'après la documentation d'oracle, ImageIcon attend le chargement complet de l'objet avec de continuer le programme.

    Tant que ça marche je ne me pose pas trop de question... Mais je vais suivre tes conseils sur l'utilisation de ImageIO.write et de BufferedImage, afin d'optimiser mes algorithmes.

    Merci beaucoup pour ton coup de pouce

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Manipulation d'images : intégrer une image dans une image
    Par noscollections dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/10/2014, 11h51
  2. Passage d'une image vers une application externe
    Par Devour dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 19/08/2013, 07h41
  3. inserer un lien vers une image dans une news
    Par jerrypeeren dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 22/07/2008, 22h51
  4. Nettoyer une image vers une couleur désirée
    Par gassi64 dans le forum OpenCV
    Réponses: 2
    Dernier message: 30/06/2008, 10h59
  5. copier une partie d'une image vers une autre
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2006, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo