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 :

changer la palette de couleurs d'une image


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Par défaut changer la palette de couleurs d'une image
    Bonjour

    Pour ne pas avoir à créer trop de fichiers pour un jeu, j'aimerai pouvoir afficher une image après avoir changé sa palette de couleurs.
    Par exemple pouvoir afficher un personnage habillé de rouge et le même personnage habillé de vert mais avec un seul fichier image source.

    salut

  2. #2
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    Peut-être en passant par un IndexColorModel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    BufferedImage imageResult = indexColorModel.convertToIntDiscrete(imageSource.getData(), true);
    Mais au final tu auras deux images en mémoire, comme si tu avais ouvert deux fichiers.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Par défaut
    Citation Envoyé par ngpub Voir le message
    Mais au final tu auras deux images en mémoire, comme si tu avais ouvert deux fichiers.
    Deux images en mémoire sa ne posera pas de problème; Par contre je me demande si cette class peut me permettre de remplacer tout les pixels d'une couleur par une autre ou si elle ne gère que pixel par pixel, auquel cas les choses ce compliquent.

  4. #4
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    Dans l'exemple 'imageSource' est une image en couleurs indexées (ex : PNG8).
    Le code crée une nouvelle image RVB construite avec une palette d'un côté et les pixels (un pixel = une valeur d'index dans la palette) de l'autre.

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 906
    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 906
    Billets dans le blog
    54
    Par défaut
    Voir java.awt.image.LookupTable et java.awt.image.LookupOp qui permettent de faire des operations globales sur la palette. En exemple, voir http://www.javaworld.com/javaworld/j...ia.html?page=3. Par contre cela ne fonctionne pas sur les images avec des couleurs indexees.

    Sinon pour un changement de palette plus ponctuel sur des couleurs donnees, avec int[] getRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize) et setRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize), tu peux carrement recuperer puis modifier le tableau des couleurs et le reinjecter dans l'image.
    Il y aussi java.awt.image.RGBImageFilter qui permet en gros de faire la meme chose.

    EDIT - apres qq heures de tests, tatonements et de recherches, je change la couleur 102 de la palette qui est A255, R0, G24 et B181.

    Nom : Image3.png
Affichages : 1051
Taille : 49,6 Ko

    1 - affichage direct de l'image telle qu'elle.

    2 - inversion des composantes G et B via getRGB() et setRGB(), la couleur ainsi creee (A255, R0, G181 et B24) est correcte au niveau des calculs mais ne s'affiche pas correctement car le modele de couleur est indexe et reste le meme. Donc la nouvelle couleur produite n'est pas dans la palette et sera en faite projetee sur la couleur la plus proche de la palette.

    3 - je modifie directement la couleur #102 de la palette et cree un nouveau IndexColorModel qui sera utilise pour creer une nouvelle image. Je trouve ca plutot complique juste pour faire cette operation qui semble simple a priori mais c'est probablement ce qu'il te faut faire.

    4-5 - utilisation de java.awt.image.RGBImageFilter.

    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
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
     
    package test;
     
    import java.awt.*;
    import java.awt.image.*;
    import java.awt.datatransfer.*;
    import java.io.*;
    import java.util.*;
    import javax.swing.*;
    import javax.imageio.*;
    import java.awt.BorderLayout;
     
    /**
     * <p>Title: </p>
     *
     * <p>Description: </p>
     *
     * <p>Copyright: Copyright (c) 2006</p>
     *
     * <p>Company: </p>
     *
     * @author not attributable
     * @version 1.0
     */
    public class TestTransparency extends JPanel {
      private Image image;
     
      public TestTransparency(String file) throws Exception {
        this(ImageIO.read(new File(file)));
      }
     
      public TestTransparency(Image image) throws Exception {
        this.image = image;
        setPreferredSize(new Dimension(image.getWidth(null), image.getHeight(null)));
      }
     
     
      public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (image != null) {
          g.drawImage(image, 0, 0, null);
        }
      }
     
      public static void main(String ...args) {
        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            JFrame frame = new JFrame("Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new FlowLayout());
            try {
              frame.add(new TestTransparency("fbavatar.gif"));
              /*
                         BufferedImage image = ImageIO.read(new File("fbavatar.gif"));
                         short[] invert = new short[256];
                         for (int i = 0; i < 256; i++) {
                invert[i] = (short) (255 - i);
                         }
                         BufferedImageOp invertOp = new LookupOp(new ShortLookupTable(0, invert), null);
                         image = invertOp.filter(image, null);
               */
              // Get RGB.
              BufferedImage image2 = ImageIO.read(new File("fbavatar.gif"));
              int[] rgb = image2.getRGB(0, 0, image2.getWidth(), image2.getHeight(), null, 0, image2.getWidth());
              for (int i = 0; i < rgb.length; i++) {
                int c = rgb[i];
                int a = (c >> 24) & 0xFF;
                int r = (c >> 16) & 0xFF;
                int g = (c >> 8) & 0xFF;
                int b = (c >> 0) & 0xFF;
                if ((g == 24) && (b == 181)) {
                  c = (a << 24) | (r << 16) | (b << 8) | (g << 0);
                  rgb[i] = c;
                  System.out.println("old G: "+g+", old B: "+b);
                  System.out.println("new G: "+((c >> 8) & 0xFF)+", new B: "+((c >> 0) & 0xFF));
                }
              }
              image2.setRGB(0, 0, image2.getWidth(), image2.getHeight(), rgb, 0, image2.getWidth());
              frame.add(new TestTransparency(image2));
              // Index Color Model.
              BufferedImage image3 = ImageIO.read(new File("fbavatar.gif"));
              IndexColorModel cm = (IndexColorModel)image3.getColorModel();
              int size = cm.getMapSize();
              System.out.println(size);
              int[] cmap = new int[size];
              rgb = null;
              for (int i = 0 ; i < size ; i++) {
                 rgb = cm.getComponents(i, rgb, 0);
                 if (i == 102) {
                   System.out.printf("%d, R: %d, G: %d, B: %d, A: %d\n", rgb.length, rgb[0], rgb[1], rgb[2], rgb[3]);
                   int green = rgb[1];
                   int blue = rgb[2];
                   rgb[1] = blue;
                   rgb[2] = green;
                 }
                 int c = (rgb[3] << 24) | (rgb[0] << 16) | (rgb[1] << 8) | (rgb[2] << 0);
                 cmap[i] = c;
              }
              int bits = cm.getPixelSize();
              int start = 0;
              boolean hasAlpha = cm.hasAlpha();
              int trans = cm.getTransparentPixel();
              int transferType = cm.getTransferType();
              IndexColorModel cm2 = new IndexColorModel(bits, size, cmap, start, hasAlpha, trans, transferType);
              image3 = new BufferedImage(cm2, (WritableRaster)image3.getData(), false, null);
              frame.add(new TestTransparency(image3));
              // RGB Filter.
              BufferedImage image4 = ImageIO.read(new File("fbavatar.gif"));
              RGBImageFilter filter = new RGBImageFilter() {
                /** {@inheritDoc}
                 */            
                @Override public int filterRGB(int x, int y, int rgb) {
                  int a = (rgb >> 24) & 0xFF;
                  int r = (rgb >> 16) & 0xFF;
                  int g = (rgb >> 8) & 0xFF;
                  int b = (rgb >> 0) & 0xFF;
                  if ((g == 24) && (b == 181)) {
                    rgb = (a << 24) | (r << 16) | (b << 8) | (g << 0);
                  }
                  return rgb;
                }
              };
              FilteredImageSource filteredSrc = new FilteredImageSource(image4.getSource(), filter);
              // Create the filtered image
              Image image5 = Toolkit.getDefaultToolkit().createImage(filteredSrc);
              frame.add(new TestTransparency(image5));  
            }        
            catch (Exception e) {
              e.printStackTrace();
            }
            frame.setVisible(true);
            frame.pack();
          }
        });
      }
    }
    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

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Par défaut
    merci à tout les 2, je vais voir avec sa.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Changer la palette de couleur d'une BufferedImage
    Par bruno bdf dans le forum Graphisme
    Réponses: 2
    Dernier message: 24/10/2012, 17h30
  2. Changer différentes couleurs dans une image
    Par cashmoney dans le forum Flex
    Réponses: 13
    Dernier message: 08/10/2009, 18h06
  3. [serieux] Changer les couleurs d'une image
    Par TabrisLeFol dans le forum La taverne du Club : Humour et divers
    Réponses: 5
    Dernier message: 14/12/2006, 13h27
  4. Changer partiellement la couleur d'une image
    Par freud dans le forum Delphi
    Réponses: 2
    Dernier message: 03/06/2006, 12h15
  5. Réponses: 2
    Dernier message: 04/04/2006, 17h03

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