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

 Java Discussion :

Modifier l'échelle d'une image dans un buffer


Sujet :

Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut Modifier l'échelle d'une image dans un buffer
    Bonjour,
    Je n'arrive pas à utiliser ce code
    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
    /** Effectue une homothétie de l'image.
     * 
     * @param bi l'image.
     * @param scaleValue la valeur de l'homothétie.
     * @return une image réduite ou agrandie.
     * 
     */public static BufferedImage scale(BufferedImage bi, double scaleValue) {
            AffineTransform tx = new AffineTransform();
            tx.scale(scaleValue, scaleValue);
            AffineTransformOp op = new AffineTransformOp(tx,
                    AffineTransformOp.TYPE_BILINEAR);
            BufferedImage biNew = new BufferedImage( (int) (bi.getWidth() * scaleValue),
                    (int) (bi.getHeight() * scaleValue),
                    bi.getType());
            return op.filter(bi, biNew);
     
    }
    dans l'exemple de David SEIGNE sur le double-buffering software
    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
    public class DoubleBufferingSoftware extends Frame{
       // boucle d'affichage
       RenderingThread renderingThread = new RenderingThread();
       // buffer mémoire (2eme buffer)
       Graphics buffer;
       // image mémoire correspondante au buffer
       Image image; 
       int x = 0; // coordonnée x de l'affichage du texte
     
       public DoubleBufferingSoftware(){
          //affichage
          setSize( 400, 400 );
          setVisible( true );
     
          // on démarre la bouche d'affichage
          renderingThread.start();
     
       }
       public void update(Graphics g){
          paint(g);
       }
       public void paint( Graphics g ){
         //création du buffer si il n'existe pas
         if(buffer==null){
            image = createImage(400,400);
            buffer = image.getGraphics();
          }
         //on dessine sur le buffer mémoire
          buffer.setColor( Color.white );
          buffer.fillRect( 0, 0, 400, 400 );
          buffer.setColor( Color.black );
          buffer.drawString( "affichage d'une ligne de texte", x, 200 );
          x++;
          if(x>400) x = 0;
          // finalement, le buffer mémoire est dessiné dans le buffer d'affichage
          g.drawImage(image, 0, 0, this);
       }
       class RenderingThread extends Thread {
         /**
          *  Ce thread appelle le rafraichissement de notre fenêtre 
          *  toutes les 10 milli-secondes
          */
          public void run(){
             while(true){
                try {
                   repaint(); 
                   sleep( 10 );
                } catch ( Exception e ) {} 
             }
          }
       }   
       public static void main(String[] args){new DoubleBufferingSoftware();}
    }
    pouvez-vous m'aiguiller SVP
    Alain

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Bonsoir,

    Je n'ai pas tenté d'utiliser votre fonction, mais elle me semble "normal" et devrai fonctionner.

    Si vous pouviez nous indiquez ce que vous n'arrivez pas à faire avec cette fonction...

    Par contre attention à votre code votre image est déclaré entant qu'objet de la classe Image et non de la classe BufferedImage.
    (BufferedImage hérite d'Image)
    cf javadoc : http://download.oracle.com/javase/6/...eredImage.html

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    Je n'ai pas tenté d'utiliser votre fonction, mais elle me semble "normal" et devrai fonctionner.
    Si vous pouviez nous indiquez ce que vous n'arrivez pas à faire avec cette fonction...
    Bonjour Patrick,
    Pour tout dire je suis un VRAI débutant Java. Je souhaite appeler la fonction dans le code exemple de David SEIGNE
    Alain

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    Bonjour,
    J'ai intégré la fonction dans le code et modifié quelques lignes
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    import java.awt.Color;
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.geom.AffineTransform;
    import java.awt.image.AffineTransformOp;
    import java.awt.image.BufferedImage;
     
    @SuppressWarnings("serial")
    public class DoubleBufferingSoftware extends Frame {
     
    	/**
             * Effectue une homothétie de l'image.
             * 
             * @param bi
             *            l'image.
             * @param scaleValue
             *            la valeur de l'homothétie.
             * @return une image réduite ou agrandie.
             * 
             */
    	public static BufferedImage scale(BufferedImage bi, double scaleValue) {
    		AffineTransform tx = new AffineTransform();
    		tx.scale(scaleValue, scaleValue);
    		AffineTransformOp op = new AffineTransformOp(tx,
    				AffineTransformOp.TYPE_BILINEAR);
    		BufferedImage biNew = new BufferedImage(
    				(int) (bi.getWidth() * scaleValue),
    				(int) (bi.getHeight() * scaleValue), bi.getType());
    		return op.filter(bi, biNew);
     
    	}
     
    	// boucle d'affichage
    	RenderingThread renderingThread = new RenderingThread();
    	// buffer mémoire (2eme buffer)
    	Graphics buffer;
    	// image mémoire correspondante au buffer
    	Image image;
    	int x = 0; // coordonnée x de l'affichage du texte
     
    	public DoubleBufferingSoftware() {
    		// affichage
    		setSize(400, 400);
    		setVisible(true);
     
    		// on démarre la bouche d'affichage
    		renderingThread.start();
     
    	}
     
    	public void update(Graphics g) {
    		paint(g);
    	}
     
    	public void paint(Graphics g) {
    		// création du buffer si il n'existe pas
    		if (buffer == null) {
    			image = createImage(400, 400);
    			buffer = image.getGraphics();
    		}
    		// on dessine sur le buffer mémoire
    		buffer.setColor(Color.white);
    		buffer.fillRect(0, 0, 400, 400);
    		buffer.setColor(Color.black);
    		buffer.fillRect(150, 150, 100, 100);
     
    		// finalement, le buffer mémoire est dessiné dans le buffer d'affichage
    		g.drawImage(image, 0, 0, this);
     
    	}
     
    	class RenderingThread extends Thread {
    		/**
                     * Ce thread appelle le rafraichissement de notre fenêtre toutes les 10
                     * milli-secondes
                     */
    		public void run() {
    			while (true) {
    				try {
    					repaint();
    					sleep(10);
    				} catch (Exception e) {
    				}
    			}
    		}
    	}
     
    	public static void main(String[] args) {
    		new DoubleBufferingSoftware();
    	}
    }
    Je ne comprends pas la remarque de kolodz
    attention à votre code votre image est déclaré entant qu'objet de la classe Image et non de la classe BufferedImage, (BufferedImage hérite d'Image)
    Son propos est clair mais je n'arrive pas à mes fins : agrandir l'échelle du dessin avec la fonction !
    Je teste sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.drawImage(image, 0, 0, this);

    Alain

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    C'est bien d'avoir une méthode scale dans la classe, ce serait quand même vachement mieux de l'utiliser

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    Citation Envoyé par sinok Voir le message
    C'est bien d'avoir une méthode scale dans la classe, ce serait quand même vachement mieux de l'utiliser
    Bonjour sinok,
    effectivement ta remarque est juste, c'est l'objet de ma question. Comment passer les paramètres dans la fonction scale
    Alain

  7. #7
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Bah tu change le type de ton Image en BufferedImage dans la classe.

    C'est à dire qu'il faut que tu dessines ton Image dans une BufferedImage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    image = createImage(400, 400);
    //Pour de l'optimisation on crée une BufferedImage compatible avec le contexte graphique de l'OS
    GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
    BufferedImage bi = gc.createCompatibleImage(image.getWidth(null), image. getHeight(null), BufferedImage.TYPE_INT_ARGB);
    //On dessine l'Image initiale sur la BufferedImage
    Graphics g = bi.createGraphics();
    g.drawImage(im);
    g.dispose();
    //On scale l'image
    bi = scale(bi,0.8);

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    Citation Envoyé par sinok Voir le message
    Bah tu change le type de ton Image en BufferedImage dans la classe.
    C'est à dire qu'il faut que tu dessines ton Image dans une BufferedImage.
    J'ai modifié mon code avec ta proposition.
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    import java.awt.Color;
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.GraphicsConfiguration;
    import java.awt.GraphicsEnvironment;
    import java.awt.Image;
    import java.awt.geom.AffineTransform;
    import java.awt.image.AffineTransformOp;
    import java.awt.image.BufferedImage;
     
    @SuppressWarnings("serial")
    public class DoubleBufferingSoftware extends Frame {
     
    	/**
             * Effectue une homothétie de l'image.
             * 
             * @param bi
             *            l'image.
             * @param scaleValue
             *            la valeur de l'homothétie.
             * @return une image réduite ou agrandie.
             * 
             */
    	public static BufferedImage scale(BufferedImage bi, double scaleValue) {
    		AffineTransform tx = new AffineTransform();
    		tx.scale(scaleValue, scaleValue);
    		AffineTransformOp op = new AffineTransformOp(tx,
    				AffineTransformOp.TYPE_BILINEAR);
    		BufferedImage biNew = new BufferedImage(
    				(int) (bi.getWidth() * scaleValue),
    				(int) (bi.getHeight() * scaleValue), bi.getType());
    		return op.filter(bi, biNew);
     
    	}
     
    	// boucle d'affichage
    	RenderingThread renderingThread = new RenderingThread();
    	// buffer mémoire (2eme buffer)
    	Graphics buffer;
    	// image mémoire correspondante au buffer
    	Image image;
    	int x = 0; // coordonnée x de l'affichage
     
    	public DoubleBufferingSoftware() {
    		// affichage
    		setSize(400, 400);
    		setVisible(true);
     
    		// on démarre la bouche d'affichage
    		renderingThread.start();
    	}
     
    	public void update(Graphics g) {
    		paint(g);
    	}
     
    	public void paint() {
    		// création du buffer s'il n'existe pas
    		if (buffer == null) {
     
    			// buffer = image.getGraphics();
     
    			image = createImage(400, 400);
    			// Pour l'optimisation on crée une BufferedImage compatible avec le
    			// contexte graphique de l'OS
    			GraphicsConfiguration gc = GraphicsEnvironment
    					.getLocalGraphicsEnvironment().getDefaultScreenDevice()
    					.getDefaultConfiguration();
    			BufferedImage bi = gc.createCompatibleImage(image.getWidth(null),
    					image.getHeight(null), BufferedImage.TYPE_INT_ARGB);
    		}
     
    		// on dessine sur le buffer mémoire
    		buffer.setColor(Color.white);
    		buffer.fillRect(0, 0, 400, 400);
    		buffer.setColor(Color.black);
    		buffer.fillRect(150, 150, 100, 100);
     
    		BufferedImage bi = null;
    		// On dessine l'Image initiale sur la BufferedImage
    		Graphics g = bi.createGraphics();
    		Image im = null;
     
    		g.drawImage(im, 0, 0, this);
    		g.dispose();
    		// On scale l'image
    		bi = scale(bi, 0.8);
     
    	}
     
    	class RenderingThread extends Thread {
    		/**
                     * Ce thread appelle le rafraichissement de notre fenêtre toutes les 10
                     * milli-secondes
                     */
    		public void run() {
    			while (true) {
    				try {
    					repaint();
    					sleep(10);
    				} catch (Exception e) {
    				}
    			}
    		}
    	}
     
    	public static void main(String[] args) {
    		new DoubleBufferingSoftware();
    	}
    }
    Le rectangle ne s'affiche toujours pas. A priori la fonction n'est pas appelée

  9. #9
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BufferedImage bi = null;
    // On dessine l'Image initiale sur la BufferedImage
    Graphics g = bi.createGraphics();
    Image im = null;
    
    g.drawImage(im, 0, 0, this);
    g.dispose();
    // On scale l'image
    bi = scale(bi, 0.8);
    Tu ne vois pas quelque chose de choquant dans ce code?

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    Citation Envoyé par sinok Voir le message
    Tu ne vois pas quelque chose de choquant dans ce code?
    Oui, avec un Null (comme moi) cela marche moins bien !
    En bref je suis noyé !

    l'insertion de tes lignes de code génère des messages "variables en double"
    et g.drawImage(im); devrait être remplacé par g.drawImage(im, 0, 0, this);

    Peux-tu me dire précisément où sont les erreurs ?
    Alain

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/07/2014, 12h37
  2. Modifier la taille d'une image dans un JFrame
    Par samarqand dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 19/06/2014, 21h17
  3. modifier la position d'une image dans une galerie
    Par VIRGINIE87 dans le forum Langage
    Réponses: 8
    Dernier message: 18/02/2010, 00h53
  4. modifier une image dans un axe d'une interface Matlab
    Par sacoux dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 26/03/2008, 18h12
  5. Modifier une image dans le page_load
    Par AlphonseBrown dans le forum ASP.NET
    Réponses: 3
    Dernier message: 06/06/2007, 09h49

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