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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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