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

2D Java Discussion :

Charger une image, la modifier, puis l'enregistrer


Sujet :

2D Java

  1. #1
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 10
    Par défaut Charger une image, la modifier, puis l'enregistrer
    Bonjour,
    Voila je souhaite charger une image pour la couper en 2 et enregistrer ces 2 nouvelles images sur mon disque.
    J'ai eut beau chercher, j'ai pas trouver de solutions.

    Voila mon code pour l'instant :

    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
     
     
    ImageIcon image =  new ImageIcon("src/img/explorer.jpg");
    int width = image.getIconWidth();
    int height = image.getIconHeight();
     
    File fRes = new File("src/img/explorer1.jpg");
    File fSource = new File("src/img/explorer.jpg");
    BufferedImage img = null;
     
    try {
                //lecture de l'image source : 
    	img = ImageIO.read(fSource);
    } catch (Throwable ef) {}
     
    int[] pixels = new int[width * height];
    PixelGrabber pg = new PixelGrabber(img, 0, 0, width, height, pixels, 0, width);
    try {
    	pg.grabPixels();
    } catch (InterruptedException e) {
    	System.err.println("interrupted waiting for pixels!");
    	}
     
    Toolkit tk = Toolkit.getDefaultToolkit();
    Image img1 = tk.createImage(new MemoryImageSource(width,height,pixels,0,width));
     
    Image image1 = new ImageIcon(img1).getImage();
    BufferedImage bufferedImage = new BufferedImage(image1.getWidth(null),image1.getHeight(null),BufferedImage.TYPE_INT_RGB );
     
    // sauvegarde dans l'image résultat
    try {
    ImageIO.write(bufferedImage, "jpg", fRes);
    } catch (IOException e) {
    e.printStackTrace();
    }
    Dans cette exemple, je ne fais que recopier mon image, si deja j'arrive a faire ca, ca devrait pas etre trop dure de selectionner que la moitie de l'image avec PixelGrabber.

    voila si quelqu'un a une idee..

    Merci beaucoup,

    Sylvain.

  2. #2
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Javadoc, PixelGrabber :

    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
        /**
         * Create a PixelGrabber object to grab the (x, y, w, h) rectangular
         * section of pixels from the specified image into the given array.
         * The pixels are stored into the array in the default RGB ColorModel.
         * The RGB data for pixel (i, j) where (i, j) is inside the rectangle
         * (x, y, w, h) is stored in the array at
         * <tt>pix[(j - y) * scansize + (i - x) + off]</tt>.
         * @see ColorModel#getRGBdefault
         * @param img the image to retrieve pixels from
         * @param x the x coordinate of the upper left corner of the rectangle
         * of pixels to retrieve from the image, relative to the default
         * (unscaled) size of the image
         * @param y the y coordinate of the upper left corner of the rectangle
         * of pixels to retrieve from the image
         * @param w the width of the rectangle of pixels to retrieve
         * @param h the height of the rectangle of pixels to retrieve
         * @param pix the array of integers which are to be used to hold the
         * RGB pixels retrieved from the image
         * @param off the offset into the array of where to store the first pixel
         * @param scansize the distance from one row of pixels to the next in
         * the array
         */
        public PixelGrabber(Image img, int x, int y, int w, int h,
    			int[] pix, int off, int scansize) {
    	this(img.getSource(), x, y, w, h, pix, off, scansize);
        }
    Ca explique tout.

    Je suppose qu'un truc comme ça devrait marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int[] pixels = new int[(int) (width / 2) * height];
    PixelGrabber pg = new PixelGrabber(img, 0, 0, width / 2, height, pixels, 0, width / 2);

  3. #3
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 10
    Par défaut
    Oui en effet ca devrait marcher, mais ce n'est pas ce mon problème..

    Le bout de code que j'ai donné ne marche pas : il devrait simplement recréer une image similaire mais il crée une image toute noire.
    Je ne vois pas pourquoi..

    Merci beaucoup.

  4. #4
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Pitêtre que ton ImageIO.read renvoie une exception mais comme tu catches tout sans logguer (ce qui est très crade), tu risques pas de le voir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    } catch (Throwable ef) {}

  5. #5
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 10
    Par défaut
    c'est vrai que ce n'etait pas tres propre..
    enfin en tout cas, ce n'est pas ca..
    d'autres idees ?

    Merci

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Toolkit tk = Toolkit.getDefaultToolkit();
    Image img1 = tk.createImage(new MemoryImageSource(width,height,pixels,0,width));
    Image image1 = new ImageIcon(img1).getImage();
    Quel est l'interet de la derniere ligne?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BufferedImage bufferedImage = new BufferedImage(image1.getWidth(null),image1.getHeight(null),BufferedImage.TYPE_INT_RGB );
    Tu crees une image de la taille de l'image source. Et c'est tout. Tu ne dessines rien dedans.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try {
    ImageIO.write(bufferedImage, "jpg", fRes);
    } catch (IOException e) {
    e.printStackTrace();
    }
    Le contenu de l'image est indeterminé. Ici c'est du noir. Rien de surprenant la dedans.

  7. #7
    Membre expérimenté
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Billets dans le blog
    1
    Par défaut
    Salut,

    tu te compliques beaucoup la vie je trouve. Dans la classe ImageIO, tu as un service read qui te renvoie une BufferedImage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public static BufferedImage read(File input) throws IOException
    Après tu travailles sur ta/tes image(s) et tu utilises à nouveau la classe ImageIO pour sauver tes images, une BufferedImage étant une RenderedImage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public static boolean write(RenderedImage im, String formatName, File output) throws IOException
    Pour dessiner, utilise plutôt les services de Graphics :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public abstract boolean drawImage(Image img, int x, int y, ImageObserver observer)

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 46
    Par défaut
    Salut,
    Tu dis vouloir la couper c'est a dire prendre une portion de l'image bien precise avec (x,y,width,height) ou juste dupliquer l'image.
    Si c'est la premiere option tu devrais utiliser de preference "CropImageFilter"

    je te donne un bout de code comme exemple
    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
     
    import java.awt.MediaTracker;
    import java.awt.image.CropImageFilter;
    import java.awt.image.FilteredImageSource;
    ......
     
    //par exemple l'image se trouve dans une class qui herite de JPanel ou un //JComponent c'est pas necessaire
     
    private Image image,imgGenerer;
     
    //on charge l'image
     
            try{
     
               this.image=ImageIO.read(new File(filename)); 
                            //filename c'est l'image que tu veux charger
            }catch(IOException ex){
            }
     
    //on creer une image de notre image chargé precedement avec un //x,y,width,height donné c'est comme si tu prends un rectangle precis ou tu //veux de l'image
     
    imgGenerer= createImage(new FilteredImageSource(image.getSource(), new CropImageFilter(x,y,width,height)));
    je l'utilise souvant pour mes jeux2D, une image donné et je charge juste la portion de l'image que je veux.

    Sinon si ton probleme est de dupliquer l'image, la repense d'anadoncamille l'explique bien.

Discussions similaires

  1. Charger une image puis la "libérer"
    Par AliHome dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/11/2008, 21h25
  2. Charger une image dans un champ TDBImage et l'enregistrer
    Par teZone dans le forum Bases de données
    Réponses: 19
    Dernier message: 10/06/2008, 03h35
  3. Charger une image dans un clip ; puis dupliquer
    Par yarol dans le forum Flash
    Réponses: 4
    Dernier message: 14/06/2007, 16h08
  4. Réponses: 3
    Dernier message: 28/03/2007, 11h54
  5. charger une image puis comparer
    Par timZeR0 dans le forum Windows
    Réponses: 3
    Dernier message: 10/10/2006, 14h13

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