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 :

Pixelisation d'image lors d'une rotation


Sujet :

2D Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 65
    Points : 37
    Points
    37
    Par défaut Pixelisation d'image lors d'une rotation
    Bonjour,
    je rencontre un problème lorsque je veux faire tourner une image.
    La rotation s'effectue correctement (bon sens etc..), mais l'image affiché est pixelisé sur les rebords. Je pense que c'est du à une mauvaise gestion de la matrice rotation dans AffineTranform, donc je voulais savoir si vous aviez des solutions (sans recoder la rotation).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void draw(Graphics g)
    {
         Graphics2D g2 = (Graphics2D) g;
         AffineTransform tfm = new AffineTransform();
         tfm.rotate(-Math.toRadians(angle), position.x+dim.width/2, position.y+dim.height/2);
         g2.setTransform(tfm);
         g2.drawImage(img, position.x, position.y, null);
    }
    Merci

  2. #2
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    avec g2.setTransform(tfm) ,tu a s fait une rotation de tout l'espace de dessin et donc tout objet ajoutée va subir la rotation.

    pour faire seulement la rotation d'une image ,tu peut utiliser le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void paintComponent(Graphics surface) 
    {
    BufferedImage source = ImageIO.read(new File("fichier image.extension"));
    BufferedImage image = new BufferedImage(source.getHeight(), source.getWidth(), source.getType());
    double centreDeRotation = image.getHeight()/2;
    AffineTransform pivoter = AffineTransform.getRotateInstance(Math.toRadians(90), centreDeRotation, centreDeRotation);
    int interpolation = AffineTransformOp.TYPE_BICUBIC;
    AffineTransformOp pivoterImage = new AffineTransformOp(pivoter, interpolation);
    pivoterImage.filter(source, image);
     
    surface.drawImage(image, 0, 0, null);

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 65
    Points : 37
    Points
    37
    Par défaut
    Merci pour la réponse, mais je ne comprend pas certaines choses. Voici mon code, img est un attribut:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ...
    private Image img = ImageIO.read(new File("images/bacterie.png"));
    ...
    BufferedImage source = (BufferedImage) img;
    BufferedImage image = new BufferedImage(source.getHeight(), source.getWidth(), source.getType());
     
    AffineTransform pivoter = AffineTransform.getRotateInstance(Math.toRadians(angle), position.x+dim.width/2, position.y+dim.height/2);
    int interpolation = AffineTransformOp.TYPE_BICUBIC;
    AffineTransformOp pivoterImage = new AffineTransformOp(pivoter, interpolation);
    pivoterImage.filter(image, image);
     
    g.drawImage(image, 0, 0, null);
    Je ne voit pas vraiment ce qu'est imageRetaillée

    Mon code précédent me donne l'erreur suivante à la ligne d'instanciation de image : java.lang.IllegalArgumentException: Unknown image type 0
    at java.awt.image.BufferedImage.<init>(Unknown Source)

  4. #4
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    salut.

    Citation Envoyé par univscien Voir le message
    Je ne voit pas vraiment ce qu'est imageRetaillée
    c'est déjà corrigé.

    pour ton erreur : tu peut utiliser directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    BufferedImage source = ImageIO.read(new File("fichier image.extension"));
    a la place de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private Image img = ImageIO.read(new File("images/bacterie.png"));
    ...
    BufferedImage source = (BufferedImage) img;

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 65
    Points : 37
    Points
    37
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    BufferedImage source = null;
    try {
    	source = ImageIO.read(new File("images/bacterie.png"));
    } catch (IOException e) {e.printStackTrace();};
     
    BufferedImage image = new BufferedImage(source.getHeight(), source.getWidth(), source.getType());
    AffineTransform pivoter = AffineTransform.getRotateInstance(Math.toRadians(angle), position.x+dim.width/2, position.y+dim.height/2);
    int interpolation = AffineTransformOp.TYPE_BICUBIC;
    AffineTransformOp pivoterImage = new AffineTransformOp(pivoter, interpolation);
    pivoterImage.filter(source, image);
     
    g.drawImage(image, 0, 0, null);
    J'ai toujours la même erreur, je comprend vraiment pas le problème :/
    Un problème à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BufferedImage image = new BufferedImage(source.getHeight(), source.getWidth(), source.getType());
    C'est pas lourd de faire un read(file()) à chaques fois ?

  6. #6
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    pour le moment , essaye avec un fichier image autre que png ,par exemple un jpg

  7. #7
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 65
    Points : 37
    Points
    37
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BufferedImage source = (BufferedImage) img;
     
    BufferedImage image = new BufferedImage(source.getHeight(), source.getWidth(), source.getType());
    AffineTransform pivoter = AffineTransform.getRotateInstance(Math.toRadians(angle), position.x+dim.width/2, position.y+dim.height/2);
    int interpolation = AffineTransformOp.TYPE_BICUBIC;
    AffineTransformOp pivoterImage = new AffineTransformOp(pivoter, interpolation);
    pivoterImage.filter(source, image);
     
    g.drawImage(img, position.x, position.y, null);
    Avec img une image jpg çà passe, mais le résultat n'est pas ce que j'attendais.
    En fait ici, l'image reste orienté dans le même sens. Je voudrais qu'elle tourne sur elle même (comme dans mon premier code), mais je ne comprend pas pourquoi ce n'est pas le cas car je donne bien le centre de l'image : position.x+dim.width/2, position.y+dim.height/2

  8. #8
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    tu peut nous présenter des figures pour comprendre le résultat que tu as obtenu ?

  9. #9
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 65
    Points : 37
    Points
    37
    Par défaut
    J'ai joins une image en PJ.
    Le gris c'est mon fond (terrain), et je me suis déplacé, mais la bactérie (verte) n'est pas resté dans le cadre noir, elle n'a pas pivoter sur elle même en gros.

    EDIT : En fait j'ai trouvé le problème. le point de rotation qu'il faut passer à getRotateInstance doit être placé dans le repère définit par la position de l'image.

    Il ne me reste plus que le problème de PNG. ^^ (merci pour l'aide )
    Images attachées Images attachées  

  10. #10
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    la méthode getRotateInstance est telque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    getRotateInstance(double angle, double centreX, double centreY)
    donc tu doit prendre le centre de rotation par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double centreDeRotationY = image.getHeight()/2;
    double centreDeRotationX = image.getWidth()/2;
    et par conséquence, tu dois faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AffineTransform pivoter = AffineTransform.getRotateInstance(Math.toRadians(Angle), centreDeRotationX, centreDeRotationY);

  11. #11
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 65
    Points : 37
    Points
    37
    Par défaut
    Oui, c'est ce que je vient de comprendre ^^

    Sinon, tu as une idée pour les PNG ?
    Parce qu'utiliser des jpg va vite devenir contraignant :/

    EDIT : J'ai finalement trouvé : BufferedImage image = new BufferedImage(taille, taille, BufferedImage.TYPE_INT_ARGB);. Le troisième paramètre spécifie qu'il y a de l'alpha donc de la transparence.

  12. #12
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 65
    Points : 37
    Points
    37
    Par défaut
    En fait j'ai encore un problème

    Lorsque je colle mon image après mon traitement de rotation etc, la couleur n'est pas la même que l'originale. Si j'ai une image bleu, çà me la colle en orange mais si l'image est blanche, çà ne me la colle pas en noir. Ce n'est donc pas mis en négatif. Je comprend pas le traitement que fait java

  13. #13
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    Citation Envoyé par univscien Voir le message
    En fait j'ai encore un problème

    Lorsque je colle mon image après mon traitement de rotation etc, la couleur n'est pas la même que l'originale. Si j'ai une image bleu, çà me la colle en orange mais si l'image est blanche, çà ne me la colle pas en noir. Ce n'est donc pas mis en négatif. Je comprend pas le traitement que fait java
    dans ce cas tu dois vérifier ton code

  14. #14
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 65
    Points : 37
    Points
    37
    Par défaut
    Cà ne peut venir que du buffer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BufferedImage source = (BufferedImage) img;
    BufferedImage image = new BufferedImage(taille, taille, BufferedImage.TYPE_INT_ARGB);
     
    AffineTransform pivoter = AffineTransform.getRotateInstance(-Math.toRadians(angle), taille/2, taille/2);
    int interpolation = AffineTransformOp.TYPE_BICUBIC;
    AffineTransformOp pivoterImage = new AffineTransformOp(pivoter, interpolation);
     
    pivoterImage.filter(source, image);
    g.drawImage(image, position.x, position.y, null);
    Le code précédent me modifie les couleurs, alors que le suivant affiche les images correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.drawImage(img, position.x, position.y, null);
    Je continue de chercher, mais rien de très concluant pour l'instant :/

  15. #15
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    pour l'instant, essayer d'utiliser cette instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int interpolation = AffineTranformOp.TYPE_BILINEAR ;
    à la place de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int interpolation = AffineTransformOp.TYPE_BICUBIC;

    sinon ,essaye avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    BufferedImage image = new BufferedImage(taille, taille, BufferedImage.TYPE_INT_RGB)
    sans prendre en considération la couche alpha

  16. #16
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 65
    Points : 37
    Points
    37
    Par défaut
    Rien a faire, les couleurs restent différente.
    J'ai essayé plusieurs changements mais rien.
    Et je ne trouve pas non plus sur internet, à croire que çà n'arrive à personne oO

  17. #17
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    salut.
    tu peut essayer avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int interpolation = AffineTranformOp.TYPE_NEAREST_HEIGHBOR;
    sinon ,pour détecter d'où
    vient l'erreur ,tu peut essayer avec un .jpg et voir le résultat.

  18. #18
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 65
    Points : 37
    Points
    37
    Par défaut
    J'ai aussi essayé ce paramètre ^^

    Pour les jpg, la couleur est bien conservé, et je ne pense pas que mes png soient un problème... donc soit c'est java qui gère mal, soit il existe une option inconnue :X

  19. #19
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    tu peut attendre la réponse de nos deux spécialistes bouye et sinok en imagerie
    bonne chance.

  20. #20
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 65
    Points : 37
    Points
    37
    Par défaut
    Ok, merci pour l'aide.
    Je crée un nouveau topic.

Discussions similaires

  1. disparition de l'affichage lors d'une rotation ou zoom
    Par 3aychoucha dans le forum OpenGL
    Réponses: 2
    Dernier message: 16/02/2012, 12h40
  2. Gestion du clavier lors d'une rotation
    Par fripon76 dans le forum Android
    Réponses: 1
    Dernier message: 05/01/2012, 10h54
  3. voir des images lors d'une réponse pour un post et gestion de tableau
    Par ledisciple dans le forum Evolutions du club
    Réponses: 1
    Dernier message: 26/09/2011, 20h11
  4. Coupage d'image lors d'une rotation
    Par roulian46 dans le forum Graphisme
    Réponses: 1
    Dernier message: 19/07/2011, 13h28
  5. Réponses: 3
    Dernier message: 16/01/2009, 14h30

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