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 :

BufferedImage et changement affichage


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 43
    Par défaut BufferedImage et changement affichage
    Bonjour,
    Je reviens vers vous car j'ai fait une application qui affiche une image et permet de faire tourner celle ci à droite ou a gauche par pas de 90°.
    Donc je peux faire des rotation de l'image.
    J'utilise un BuferedImage pour l'affichage avec drawImage.
    Après chaque rotation je fais un repaint pour refaire l'affichage.
    Tout marche bien mais lorsque je récupère le BufferedImage et que je le passe à une autre application (qui étend JPanel) et bien l'image qui s'affiche est celle initiale et non celle qui a subit une rotation.
    Donc comment faire pour enregistrer les changements ??
    Merci infiniment de votre aide et de votre retour.
    Bonne soirée,
    Bien cordialement,
    Frederic

    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
     
    public void paintComponent(Graphics g) {
                super.paintComponent(g);    // paint background
     
                if (image == null) {
                    return;
                }
     
                Graphics2D g2 = (Graphics2D) g;
         //**********  gestion roation image   *******************//
                AffineTransform origXform = g2.getTransform();
                AffineTransform newXform = (AffineTransform)(origXform.clone());
                //center of rotation is center of the panel
                int xRot = this.getWidth()/2;
                int yRot = this.getHeight()/2;
                newXform.rotate(Math.toRadians(currentAngle), xRot, yRot);
                g2.setTransform(newXform);
                //draw image centered in panel
    //            int x = (getWidth() - image.getWidth(this))/2;
    //            int y = (getHeight() - image.getHeight(this))/2;
         //*******************************************************//
     
                double w = image.getWidth() *scaleWidth;
                double h = image.getHeight() *scaleHeight;
     
                Dimension dim = getSize();
                double x = 0;
                double y = 0;
     
                if (dim.getWidth() > w) {
                    x = (dim.getWidth() - w)/2;
                }
     
                if (dim.getHeight() > h) {
                    y = (dim.getHeight() - h)/2;
                }
     
                g2.drawImage(image,(int)x,(int)y,(int)w,(int)h,this);
     
                g2.setTransform(origXform);

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Les transformations que tu effectues ne s'appliquent que sur l'affichage et non pas sur l'image elle-meme. Si tu veux creer une image disposant des memes transformations tu dois appliquer une BufferedImageOp (et plus precisement sur une AffineTransformOp avec des transformations similaires) sur ton image.

    Attention au calcul des dimensions de l'image destination si tu veux eviter que ca ne coupe sur les bords.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 43
    Par défaut
    Bonsoir,
    Merci du retour,
    J'ai essayé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AffineTransformOp rotOp = new AffineTransformOp(origXform, AffineTransformOp.TYPE_BILINEAR);
    res = rotOp.filter(image,res);
    Mais ça ne fait rien
    Si tu pouvais me mettre sur la voie ce serait sympa.
    Merci
    Fred

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Si je comprends bien ton code origXform est la transformation d'origine du Graphics (celle avant que tu ne commences a travailler dessus), toi tu veux newXform (ou une transformation similaire adaptee a ton repere de travail actuel)
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 43
    Par défaut
    Hello Bouye,
    Merci de to nretour,
    Oui donc en fait je clique sur une petite icône que j'ai mis dans une zone et j'appelle uen methode qui fait ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void rotate() {
            //rotate 90 degrees at a time
            currentAngle+=90.0;
            if (currentAngle >= 360.0) {
              currentAngle = 0;
            }
            repaint();
          }
    Donc le repaint rappelle la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public void paintComponent(Graphics g)
    Que je t'ai décris juste avant.
    Voilà merci infiniment de ton aide et de ton retour,
    Bonne journée
    Bien cordialement,
    Fred

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 43
    Par défaut
    Hello Bouye,
    Je te fais parvenir mon code qui me récupère le BufferedImage avec rotation, mais je perd un peu dans la dimension de l'image.
    En effet elle n'a pas exactement la même dimension (à peu de chose près).
    Merci de ton aide
    Cordialement,
    Frederic

    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
     
    public static BufferedImage changeRotateImage(BufferedImage orign, int width, int height,ImageObserver ob) {
            double scale;
     
            Dimension src = new Dimension(orign.getWidth(ob),orign.getHeight(ob));
            Dimension dest = new Dimension(width,height);
            scale = scaleToFit(src,dest);
     
            double w = orign.getWidth(ob) * scale;
            double h = orign.getHeight(ob) * scale;
    //        double w = width;
    //        double h = height;
    //        int xRot = orign.getWidth()/2;
    //        int yRot = orign.getHeight()/2;
            int xRot = orign.getWidth();
            int yRot = orign.getHeight();
     
            Image scaled = orign.getScaledInstance(width, height,Image.SCALE_SMOOTH);
            BufferedImage rotateImage = new BufferedImage((int)w,(int)h,BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = rotateImage.createGraphics();
     
            AffineTransform origXform = g2.getTransform();
            AffineTransform newXform = (AffineTransform)(origXform.clone());
            //newXform.rotate(Math.toRadians(90.0), xRot/2, yRot/2);
            newXform.rotate(Math.toRadians(90.0), xRot/2, yRot/(1.6));
            AffineTransformOp op = new AffineTransformOp(newXform, AffineTransformOp.TYPE_BILINEAR);
            //g2.setTransform(newXform);
            g2.drawImage(scaled,0,0,(int)w,(int)h,ob);
            rotateImage = op.filter(rotateImage, null);
            //rotateImage = op.filter(orign, null);
            g2.dispose();
     
            return rotateImage;
        }

Discussions similaires

  1. changement affichage sous formulaire
    Par nogood1 dans le forum VBA Access
    Réponses: 1
    Dernier message: 06/11/2007, 22h26
  2. request sql, suivi d'un changement d'affichage de données ?
    Par chapeau_melon dans le forum Oracle
    Réponses: 6
    Dernier message: 14/03/2007, 08h18
  3. Probleme Affichage Panel avec Changement Résolution
    Par devlopassion dans le forum C++Builder
    Réponses: 5
    Dernier message: 11/01/2007, 20h30
  4. Affichage d'une image avec changement quand le pointeur est dessus
    Par mauriiice dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/09/2006, 20h21
  5. Changement d'affichage d'un formulaire
    Par Anthony17 dans le forum Access
    Réponses: 5
    Dernier message: 02/05/2006, 22h15

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