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 :

Problème d'antialiasing des bords d'une image lors d'un rendu avec rotation


Sujet :

2D Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Problème d'antialiasing des bords d'une image lors d'un rendu avec rotation
    Bonjour,
    pour une applet, j'essaie de dessiner une image en lui donnant une rotation.
    Si l'intérieur de l'image est lisse, les bords sont crénelés (bordure noire arrondie aux bords). J'ai essayé tous les paramère de RenderingHint, rien n'y fait. Je cherche donc un moyen de rendre mes images avec un bord lisse.
    Ce code étant pour une applet, il serait mieux qu'il tourne sans devoir ajouter de librairie.

    Merci par avance,
    FL

    Contenu de la méthode paint
    note : at est une instance de AffineTransform, io l'image observer, angle l'angle de rotation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Graphics2D g2d = (Graphics2D)g;
    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);		g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
    g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
    g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE);
    g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
    at.setToIdentity();
    at.rotate(angle);
    g2d.drawImage([image], at, io);

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 846
    Points : 22 851
    Points
    22 851
    Billets dans le blog
    51
    Par défaut
    La méthode la plus simple et la plus rapide à mettre en oeuvre est de dessiner ton image dans une autre qui est légèrement plus grande et est remplie avec la couleur de fond de ton panel (ton image sera alors encadrée). Une fois la rotation effectués les bords de la grande image sont toujours aliasés mais ils se confondront avec la couleur de fond du panel et donc le tout sera invisible à l'oeil. Une bordure de 1 pixel de chaque coté est suffisant pour avoir un bon résultat.

    Evidement cela ne fonctionne que si le fond de ton panel est de couleur uni.
    Comme le résultat peut varier suivant les systèmes tu peux spécifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    D'ailleurs sur mon PC sous W7, RenderingHints.KEY_RENDERING a plus d'impact visuel que RenderingHints.KEY_INTERPOLATION (RenderingHints.VALUE_INTERPOLATION_BILINEAR et RenderingHints.VALUE_RENDER_SPEED sont probablement les valeurs par défaut).

    RenderingHints.VALUE_INTERPOLATION_BICUBIC n'offre généralement pas une amélioration sensible de la qualité du rendu par rapport à la complexité / lenteur de l'algorithme utilisé.

    La plupart des autres indices de rendus que tu as mis ne s'appliquent pas au rendu d'image bitmap mais au dessin des formes vectorielles ou a la gestion des couleurs lorsqu'on utilise des résolutions de plus faible bitdepth.

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 846
    Points : 22 851
    Points
    22 851
    Billets dans le blog
    51
    Par défaut
    Après quelques tests en plus : ça marche aussi très bien si la bordure est constituée de pixels transparents et ça s'adaptera bien mieux à un panel dont le fond est une texture ou un gradient par exemple.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Ok merci pour cette astuce j'vais essayer ça!

Discussions similaires

  1. [GD] Problème avec des fonctions qui créent des éléments dans une image.
    Par magnus2229 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 13/07/2011, 09h38
  2. Détection position des yeux dans une image
    Par Morvan Mikael dans le forum Traitement d'images
    Réponses: 16
    Dernier message: 24/12/2008, 23h09
  3. diffusion des pixels d'une image
    Par hagui dans le forum Traitement d'images
    Réponses: 11
    Dernier message: 11/05/2006, 18h31
  4. [MFC]déplacement des pixels d'une image
    Par hagui dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2006, 16h51
  5. utiliser des morceaux d'une image pour faire des boutons
    Par Battosaiii dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 14/12/2005, 00h05

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