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 : Changement de couleur avec un png


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 BufferedImage : Changement de couleur avec un png
    Salut,
    j'ai un problème avec mes images png. Lorsque je crée un buffer pour faire pivoter l'image, les couleurs sont différentes de l'image originale.
    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);
    Alors qu'avec le code si dessous, les couleurs sont bonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.drawImage(img, position.x, position.y, null);
    Je cherche depuis un petit moment, donc si vous avez des idées...
    Merci

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Il est probable que ton BufferedImage source ne soit pas en ARGB.

    drawImage() fait des conversions de couleur de bonne qualité, car c'est surtout une méthode utilitaire faite pour se simplifier la vie et pas pour améliorer les performances.

    Un AffineTransformOp , par contre, est plus souvent utilisé entre images qui utilisent le même système de couleurs. Il me semble qu'il fait la conversion de couleurs, mais celle qui va le plus vite et qui a la moins bonne qualité.

    Deux possibilités :
    1 - Commencer par mettre ton image source dans un autre BufferedImage qui est en ARGB, avec drawImage(), puis ensuite utiliser la transformée affine de l'une vers l'autre. (Moi je préfère faire ça : m'aligner sur un colorspace d'une part, manipuler les images d'autre part.)

    2 - Jouer avec le constructeur de AffineTransformOp qui accepte les RenderingHints, pour essayer de corriger ça. (Je ne suis pas sûr, mais je pense à KEY_COLOR_RENDERING et VALUE_COLOR_RENDER_QUALITY)

  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
    Pour la solution 2, j'ai essayé le code suivant, mais sans succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AffineTransformOp pivoterImage = new AffineTransformOp(pivoter, new RenderingHints(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY));
    Pour la première solution, tu pourrais détailler ?
    J'ai pas tout compris ^^'

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Pour la première méthode, la seule façon générique de le faire que je connaisse, c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BufferedImage source = (BufferedImage) img;
    int sourceWidth = source.getWidth();
    int sourceHeight = source.getHeight();
     
    BufferedImage sourceRgb = new BufferedImage(sourceWidth, sourceHeight, BufferedImage.TYPE_INT_ARGB);
     
    sourceRgb.createGraphics().drawImage(source, 0, 0, null);
     
    // Et là, sourceRgb contient l'image source convertie en ARGB.
    Comme ça la différence de format de couleurs est éliminée.


    Pour la solution 2... Je sais pas vraiment, je m'y connais pas en traitement d'image, je me dis juste qu'il doit y avoir des moyens.

    Si ça n'a pas marché avec ce hint, ça peut valoir le coup d'essayer avec KEY_DITHERING. En fait, juste lire la JavaDoc de AffineTransformOp et essayer les différentes suggestions.

  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
    Merci pour la réponse, mais j'ai toujours le même problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    BufferedImage source = (BufferedImage) img;
    BufferedImage image = new BufferedImage(taille, taille, BufferedImage.TYPE_INT_ARGB);
     
    image.createGraphics().drawImage(source, 0, 0, null);
     
    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);
    J'ai juste rajouté image.createGraphics().drawImage(img, 0, 0, null);.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Ben ? Tu pensais que ça allait faire quoi, ça, au juste ?

    Je t'explique le raisonnement :

    - Tu nous a dit que tu n'as pas de problème de couleur quand tu fais un drawImage().

    - Moi j'en déduis que le problème est sans doute qu'il y a une conversion de couleurs à faire, et qu'un AffineTransformOp ne la fait pas automariquement de la même façon qu'un drawImage().

    - Donc on commence par convertir les couleurs de l'image source de je ne sais pas quoi vers ARGB, en utilisant drawImage().

    - *Ensuite* on applique la transformée affine sur cette conversion de la source.

    Donc, ça donnerait :

    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
    // Convertir l'image source en ARGB
    int sourceWidth = source.getWidth();
    int sourceHeight = source.getHeight();
     
    BufferedImage sourceRgb = new BufferedImage(sourceWidth, sourceHeight, BufferedImage.TYPE_INT_ARGB);
     
    sourceRgb.createGraphics().drawImage(source, 0, 0, null);
    // Ici, sourceRgb contient l'image source convertie en ARGB.
     
    // Appliquer la transformée affine sur sourceRgb
    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(sourceRgb, image);

  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
    Effectivement, j'avais pas compris qu'il fallait "convertir" la source en ARGB. Maintenant çà marche, merci

Discussions similaires

  1. [BI4] Problèmes changement de couleurs avec l'option Conditionnel
    Par gautier.c dans le forum Webi
    Réponses: 2
    Dernier message: 20/01/2015, 14h32
  2. [XL-2003] changement de couleur avec formule
    Par spineker dans le forum Excel
    Réponses: 4
    Dernier message: 05/01/2014, 07h31
  3. Changement de couleur avec CSS
    Par mickael28 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 15/07/2008, 09h09
  4. changement de couleur en rapport avec un champ
    Par yannzool dans le forum IHM
    Réponses: 42
    Dernier message: 13/03/2007, 17h12
  5. Réponses: 1
    Dernier message: 07/05/2006, 16h33

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