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 :

Couleur tranparente d'une image


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 341
    Par défaut Couleur tranparente d'une image
    Bonjour,

    je voudrais afficher une image constituant le fond d'une JWindow.
    Cette image est de type PNG avec le noir comme couleur transparente.

    J'ai lu dans plusieurs posts que JAVA gère automatiquement la couleur transparente lorsqu'il s'agit d'image au format PNG.
    Ben, dans mon cas, cela ne fonctionne pas

    Voici quelques morceaux du code utilisé pour charger l'image depuis les ressources:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    try
    {
      imageLogo = ImageIO.read( getClass().getResource( "Plaque translucide 800x600.png" ));
     
      largeur = imageLogo.getWidth();
      hauteur = imageLogo.getHeight();
     
      this.setSize( new Dimension( largeur, hauteur ));
      this.setLocationRelativeTo( null );
    }
    catch ( IOException ioE )
    {
      ioE.printStackTrace();
    }
    Voici la partie du code qui affiche le logo après avoir fait une capture de l'écran se situant sous la zone d'affichage:
    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
    public void afficheLogo()
    {
      BufferedImage imageCapture;
      Graphics2D g2D;
      Robot Automate;
     
      try
      {
        Automate = new Robot( getGraphicsConfiguration().getDevice() );
        imageCapture = Automate.createScreenCapture( getBounds() );
     
        imageTravail = null; // Au cas où cela se passe mal, il n'y aura rien à afficher
        imageTravail = new BufferedImage( largeur, hauteur, BufferedImage.TYPE_INT_ARGB );
        g2D = (Graphics2D)imageTravail.getGraphics();
     
        g2D.drawImage( imageCapture, null, 0, 0 );
        g2D.drawImage( imageLogo, 0, 0, null );
     
        this.setVisible( true );
      }
      catch ( AWTException awtE )
      {
        System.out.println( awtE.getMessage() );
      }
    }
    Et bien sûr l'affichage de la fenêtre JWindow:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void paint ( Graphics G )
    {
      if ( imageTravail != null )
        G.drawImage( imageTravail, 0, 0, null );
     
    }
    Voila, ce code affiche la plaque rectangulaire du logo, avec la partie "noire" qui devrait en fait laisser passer les pixels de la capture écran. Où est le problème ?

    Merci et à bientôt...

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Juste comme ça, PNG gère parfaitement les composantes ARGB, donc parfaitement la couche alpha et java sait afficher les couleurs ARGB.

    Pourquoi utiliser du noir dans ton PNG comme couleur alors que tu peux parfaitement utiliser une couleur vraiment transparente c'est à dire transparente et pas noir?

    Par exemple l'image suivante possède un vrai fond transparent: http://upload.wikimedia.org/wikipedi...feine-icon.png

    A noter qu'il ne faut jamais produire de PNG à fond transparent en passant par paint. Car l'encoder PNG de paint est juste de très mauvaise qualité.

    Un soft comme paint.net ou the gimp au contraire gèrera parfaitement le PNG transparent.

  3. #3
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 341
    Par défaut
    Merci pour ce tuyau.

    L'image que j'utilise pour mon application possède vraiment un fond transparent, car lorsque je la visionne via le gestionnaire de fichiers Windows, on constate qu'elle n'affiche pas d'arrière plan.
    Néanmoins je vais tester mon application avec l'image que vous m'avez indiquée dans le post...on verra si c'est une affaire de "mauvais png".
    D'autre part, je vais essayer ce petit programme "Paint.net" que je ne connaissais pas. J'avoue que j'ai tâté du Gimp, et ce logiciel ne me convient pas du tout.
    Quant au logiciel que j'utilise actuellement, il commence à présenter quelques rides, il date de 2002. Il a tout de même le mérite de gérer le PNG, et de fonctionner encore de nos jours.

    @ bientôt...

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Je n'avais pas regardé ton code à vrai dire.

    Il présente pour commencer si l'on veut dessiner sur un composant il ne faut pas passer par les graphics obtenus par la méthode getGraphics. En effet les graphics obtenus de cette façon sont totalement éphémères et au prochain repaint ton image disparaitra.

    Bref pour faire un splashscreen qui n'ait pas l'air rectangle tu as deux façons de procéder, dépendant de la version de java.

    EN pré java 6 il faut passer par le coup du screenshot de l'arrière plan:

    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
    package swing.ui;
     
    import java.awt.AWTException;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.HeadlessException;
    import java.awt.Rectangle;
    import java.awt.Robot;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.JComponent;
    import javax.swing.JWindow;
    import javax.swing.Timer;
     
    public class MySplash extends JComponent {
     
        private BufferedImage logo;
        private BufferedImage backgroundImage;
     
        public MySplash(BufferedImage logo) {
            this.logo=logo;
            try {
                Robot r = new Robot();
                Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
                backgroundImage =  r.createScreenCapture(new Rectangle(screensize.width/2-logo.getWidth()/2, screensize.height/2-logo.getHeight()/2, logo.getWidth(), logo.getHeight()));
     
            } catch (HeadlessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (AWTException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
     
        protected void paintComponent(Graphics arg0) {
            arg0.drawImage(backgroundImage, 0, 0, null);
            arg0.drawImage(logo, 0, 0, null);
        };
     
        public void setLogo(BufferedImage logo) {
            this.logo = logo;
        }
     
        public static void main(String[] args) {
     
            try {
                BufferedImage im = ImageIO.read(MySplash.class.getResource("/Nepomuk.png"));
                MySplash splash = new MySplash(im);
                final JWindow window = new JWindow();
                window.add(splash);
                window.setSize(im.getWidth(), im.getHeight());
                window.setLocationRelativeTo(null);
                window.setAlwaysOnTop(true);
                window.setVisible(true);
     
                final Timer t = new Timer(5000, new ActionListener() {
     
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        window.dispose();
                    }
                });
                t.start();
     
     
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    En post java6 u12 les fenêtres peuvent devenir transparentes:

    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
    package swing.ui;
     
    import java.awt.AWTException;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.HeadlessException;
    import java.awt.Rectangle;
    import java.awt.Robot;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.JComponent;
    import javax.swing.JWindow;
    import javax.swing.Timer;
     
    import com.sun.awt.AWTUtilities;
     
    public class MySplash extends JComponent {
     
        private BufferedImage logo;
     
        public MySplash(BufferedImage logo) {
            this.logo=logo;
        }
     
        protected void paintComponent(Graphics arg0) {
            arg0.drawImage(logo, 0, 0, null);
        };
     
        public void setLogo(BufferedImage logo) {
            this.logo = logo;
        }
     
        public static void main(String[] args) {
     
            try {
                BufferedImage im = ImageIO.read(MySplash.class.getResource("/Nepomuk.png"));
                MySplash splash = new MySplash(im);
                final JWindow window = new JWindow();
                window.add(splash);
                window.setSize(im.getWidth(), im.getHeight());
                window.setLocationRelativeTo(null);
                window.setAlwaysOnTop(true);
                window.setVisible(true);
                AWTUtilities.setWindowOpaque(window, false);
     
                final Timer t = new Timer(5000, new ActionListener() {
     
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        window.dispose();
                    }
                });
                t.start();
     
     
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    Les deux nécessitent toutefois que ton PNG soit correctement encodé.

  5. #5
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 341
    Par défaut
    Merci beaucoup pour ces dernières précisions, dont je vais étudier le code.

    Mais vous aviez déjà raison quant à la qualité de mon PNG.
    En faisant un PNG à l'aide du logiciel Paint.NET, le code que j'ai posté fonctionne. Il s'agissait bien d'un problème de codage de la transparence par le "vieux" logiciel que j'utilisais jusqu'à présent.

    Merci encore & @ bientôt.

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

Discussions similaires

  1. la couleur dominante d'une image RGB
    Par aichaeside dans le forum Images
    Réponses: 7
    Dernier message: 25/06/2009, 15h56
  2. Réponses: 1
    Dernier message: 22/12/2008, 15h42
  3. [GD] modifier les couleurs claires d'une image
    Par calitom dans le forum Bibliothèques et frameworks
    Réponses: 13
    Dernier message: 09/12/2008, 17h01
  4. [ImageMagick] Couleur dominante d'une image
    Par matique dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 03/07/2006, 15h24
  5. [ImageMagick] Détection des couleurs approximative d'une image ?
    Par SkyDev dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 18/01/2006, 14h17

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