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 :

[SWING][JAVA2D] définir le couleur transparente d'un PNG


Sujet :

2D Java

  1. #1
    Membre du Club
    Homme Profil pro
    Concepteur/Développement
    Inscrit en
    Juin 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Concepteur/Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2004
    Messages : 60
    Points : 52
    Points
    52
    Par défaut [SWING][JAVA2D] définir le couleur transparente d'un PNG
    Bonjour,

    J'ai deux images PNG à afficher. La première sert de fond d'écran, la seconde vient par dessus.
    En ouvrant cette seconde image avec GIMP, il ya bien de la transparence sur les bords, mais affichée dans Internet Explorer le transparent est remplacé par du gris. Dans le Java (avec SetPaint et Fill) j'ai du noir.
    Je ne trouve pas comment le faire.
    J'ai utilisé la notion d'alphacomposite mais dans ce cas la transparence se fait au niveau de l'image entière.
    N'est-ce pas dû au format de l'image ?

  2. #2
    Membre actif
    Avatar de narkotik
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Points : 229
    Points
    229
    Par défaut
    good topic ca ! j'aime
    euh ce que tu utilises c'est pour la transparence d'une texte, texture ou d'une image mais dans son intégralité car tu modifies la couche alpha c'est pour ca que ca marche pas, j't'écris un programme rapide laisse moi quelques minutes
    (+mitch): nan mais nanar j'préfère mourir contre un platane apres un accident de voiture plutot que d'une rupture d'anévrisme devant mon ecran d'pc

  3. #3
    Membre actif
    Avatar de narkotik
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Points : 229
    Points
    229
    Par défaut
    en esperant que cela puisse t'aider et repondre a ta question
    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
     
    import java.awt.*;
    import java.awt.image.*;
    import java.io.*;
    import java.net.*;
    import javax.imageio.*;
    import javax.swing.*;
     
    class Transparent 
    {
    	public static void main(String[] args) throws IOException 
    	{
    		//-------------------------variables--------------------------
    		URL url = new URL("http://www.google.fr/images/logo_sm.gif");
    		BufferedImage image = ImageIO.read(url);
    		image = convert(image);
    		//---------------------------body-----------------------------
    		JFrame $f = new JFrame("Transparence");
    		JLabel label = new JLabel(new ImageIcon(image));
    		label.setOpaque(true);
    		$f.getContentPane().add(label);
    		$f.pack();
    		$f.setLocationRelativeTo(null);
    		$f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		$f.setVisible(true);
    	}
     
    	static BufferedImage convert(BufferedImage image) 
    	{
    		ColorModel cm = image.getColorModel();
    		if (cm instanceof IndexColorModel) {
    			IndexColorModel icm = (IndexColorModel) cm;
    		int[] cmap = new int[icm.getMapSize()];
    		icm.getRGBs(cmap); //recup la couleur en format RGB
    		int white = 0xFFFFFFFF; //RGBA format
    		int i;
    		for(i=0; i<cmap.length; ++i)
    			if (cmap[i] == white)
    				break;
    		if (i != cmap.length) 
    		{
    			cmap[i] = 0; //transparent
    		IndexColorModel newicm = new IndexColorModel(8, cmap.length, cmap,0, true, 
     
    Transparency.BITMASK, DataBuffer.TYPE_BYTE);
    		image = new BufferedImage(newicm, image.getRaster(), false, null);
    		} 
    		else
    			System.out.println("couleur blanche pas trouvee");
    		} else
    		System.out.println("ce n'est pas un model de couleusr indexe");
    		return image;
    	}
    }
    [ Modéré par vedaer ]
    -> Ajout des balises code
    [ Merci de respecter les Règles du Forum ]
    (+mitch): nan mais nanar j'préfère mourir contre un platane apres un accident de voiture plutot que d'une rupture d'anévrisme devant mon ecran d'pc

  4. #4
    Membre du Club
    Homme Profil pro
    Concepteur/Développement
    Inscrit en
    Juin 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Concepteur/Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2004
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    Merci
    Bon je vois tu définis quelle est la couleur qui doit être transparente.
    Je vais tester ton code avec une PNG.
    Par contre, mon PNG en question présente déjà de la transparence : en fait c'est un quadrilatère dont le couleur de fond est transparente.

    Est-ce que cela va marcher ?

  5. #5
    Membre actif
    Avatar de narkotik
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Points : 229
    Points
    229
    Par défaut
    pourquoi tu exportes pas ton image au format GIF avec directement un bit de transparence ? tu gagnerais en temps et en simplicité
    (+mitch): nan mais nanar j'préfère mourir contre un platane apres un accident de voiture plutot que d'une rupture d'anévrisme devant mon ecran d'pc

  6. #6
    Membre du Club
    Homme Profil pro
    Concepteur/Développement
    Inscrit en
    Juin 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Concepteur/Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2004
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    En fait je veux faire un programme de gestion de skin d'un programme dont les fichiers de base sont en PNG.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 52
    Points : 38
    Points
    38
    Par défaut
    C'est paradoxal ce que tu veux faire car le format PNG gère déjà la transparence ! A toi de faire simplement tes images correctement et c'est tout. Ce n'est pas une question de Java mais d'image.

  8. #8
    Membre du Club
    Homme Profil pro
    Concepteur/Développement
    Inscrit en
    Juin 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Concepteur/Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2004
    Messages : 60
    Points : 52
    Points
    52
    Par défaut
    Dans ce cas, quelles instructions utilisez-vous pour que l'image apparaîssent avec la transparence.
    Je prend une bufferedImage que j'affiche avec un TexturePaint mais cela ne fonctionne pas.

    Il y a peut-être une autre méthode ?

  9. #9
    Membre du Club
    Homme Profil pro
    Concepteur/Développement
    Inscrit en
    Juin 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Concepteur/Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2004
    Messages : 60
    Points : 52
    Points
    52
    Par défaut Te be a quiche ?
    Effectivement, cela marche mieux avec la fonction imageIO.read à la place du getToolkit.getImage.

    Merci à Narkotik, en partant de ton source, mais deux PNG s'affiche comme il faut.

  10. #10
    Membre actif
    Avatar de narkotik
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Points : 229
    Points
    229
    Par défaut
    pas de probleme,
    par contre j'ai un truc à t'apprendre, ImageIO, tes tes images chargées avec ca ne seront pas accélérées, et donc si t'as besoin de vitesse pour faire une petite anim ou je sais pas quoi tu t'en rendras rapidement compte.

    Toolkit.createImage(..) <= yeah accélérée grace à la mise en VRAM 8)
    ImageIO.read(..) <= berk, pas accéléré, seulement mis en RAM

    alors avant que tu pleures, j'te file une solus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BufferedImage src = javax.imageio.ImageIO.read(getClass().getResource(resource));
    BufferedImage dst = gc.createCompatibleImage(src.getWidth(),src.getHeight(),src.getColorModel().getTransparency());
    avec ca tu charges avec ImageIO et tu mets ca dans la VRAM, pas d'la balle ca?
    (+mitch): nan mais nanar j'préfère mourir contre un platane apres un accident de voiture plutot que d'une rupture d'anévrisme devant mon ecran d'pc

  11. #11
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut Intégrer des image dans un programme
    Citation Envoyé par narkotik
    pas de probleme,
    par contre j'ai un truc à t'apprendre, ImageIO, tes tes images chargées avec ca ne seront pas accélérées, et donc si t'as besoin de vitesse pour faire une petite anim ou je sais pas quoi tu t'en rendras rapidement compte.

    Toolkit.createImage(..) <= yeah accélérée grace à la mise en VRAM 8)
    ImageIO.read(..) <= berk, pas accéléré, seulement mis en RAM

    alors avant que tu pleures, j'te file une solus

    BufferedImage src = javax.imageio.ImageIO.read(getClass().getResource(resource));
    BufferedImage dst = gc.createCompatibleImage(src.getWidth(),src.getHeight(),src.getColorModel().getTransparency());

    avec ca tu charges avec ImageIO et tu mets ca dans la VRAM, pas d'la balle ca?
    Bonjour,

    Vous êtes train de dire qu'il y a des images accélérées et non accélérées. En parlant de ça j'ai aussi un code semblable

    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
     
     
    import javax.imageio.*;
    import java.io.*;
    import java.awt.image.*;
     
     private BufferedImage bi;
     
     
     
     
    try {
     this.bi = ImageIO.read(new File(source));
     
            this.setSize(bi.getWidth(this), bi.getHeight(this));
       catch (IOException ioe) {
     
    }

    D'après ce que vous dites, l'image qui en résulte n'est pas accélérée. Comment faire pour qu'elle le soit ?


    Merci de me répondre

    Battant
    Battant

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    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 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    C'est pourtant poste juste quelques lignes plus haut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BufferedImage src = javax.imageio.ImageIO.read(getClass().getResource(resource));
    BufferedImage dst = gc.createCompatibleImage(src.getWidth(),src.getHeight(),src.getColorModel().getTransparency());
    Note : gc c'est une instance de GraphicsConfiguration qu'on a via un GraphicsConfiguration configuration = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); (par exemple).

    Ne pas confondre une BufferedImage et une VolatileImage, Gfx avait deja explique que les BufferedImage sont acceleree depuis quelques temps deja. Ce n'est pas tant qu'elle seront accelerees apres cet appel mais plutot qu'elles seront dans un format que la carte video n'aura pas besoin de transformer pour utiliser/manipuler l'image (et donc qu'on gagne du temps a chaque fois qu'on l'affiche).
    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

  13. #13
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut
    Bonjour,

    Excusez-moi mais ça ne semble pas marcher votre truc

    En effet, suite au modification que j'ai faites

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
          BufferedImage b = ImageIO.read (new File (source));
            GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getDefaultConfiguration();
          this.bi = gc.createCompatibleImage(b.getWidth(),b.getHeight());
     
      this.setSize(bi.getWidth(this), bi.getHeight(this));
     
     public void paintComponent(Graphics g) {
    	if (bi != null) {
      g.drawImage(bi, (this.getWidth() - bi.getWidth()) / 2,(this.getHeight() - bi.getHeight()) / 2, null);
    	}
        }
    Ce code me donne des zones noire à la place des images. En plus avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
             this.setSize(bi.getWidth(this), bi.getHeight(this),b.getColorModel().getTransparency());
    ça ne compile pas du tout car Transparency est un int.

    Note : Mes images sont au format jpg.

    Merci d'avance pour votre aide

    Battant

    Citation Envoyé par bouye
    C'est pourtant poste juste quelques lignes plus haut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BufferedImage src = javax.imageio.ImageIO.read(getClass().getResource(resource));
    BufferedImage dst = gc.createCompatibleImage(src.getWidth(),src.getHeight(),src.getColorModel().getTransparency());
    Note : gc c'est une instance de GraphicsConfiguration qu'on a via un GraphicsConfiguration configuration = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); (par exemple).

    Ne pas confondre une BufferedImage et une VolatileImage, Gfx avait deja explique que les BufferedImage sont acceleree depuis quelques temps deja. Ce n'est pas tant qu'elle seront accelerees apres cet appel mais plutot qu'elles seront dans un format que la carte video n'aura pas besoin de transformer pour utiliser/manipuler l'image (et donc qu'on gagne du temps a chaque fois qu'on l'affiche).
    Battant

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     gc.createCompatibleImage(b.getWidth(), b.getHeight(),Transparency.BITMASK);


    en version plus complête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    // Create an image that does not support transparency
        bimage = gc.createCompatibleImage(width, height, Transparency.OPAQUE);
     
        // Create an image that supports transparent pixels
        bimage = gc.createCompatibleImage(width, height, Transparency.BITMASK);
     
        // Create an image that supports arbitrary levels of transparency
        bimage = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT);
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  15. #15
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut
    utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     gc.createCompatibleImage(b.getWidth(), b.getHeight(),Transparency.BITMASK);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           this.bi = gc.createCompatibleImage(b.getWidth(),b.getHeight(),Transparency.BITMASK);
    ça ne marche pas, zone grise à la place de l'image.

    Merci de m'aider

    Battant
    Battant

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Dans ce cas essaies Transparency.TRANSLUCENT à la place de Transparency.BITMASK
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 29
    Points
    29
    Par défaut
    Je me permet de compléter ce topic avec un lien vers un article de la FAQ qui m'a permis de mieux comprendre (j'espère que ce lien en aidera d'autres) Il traite de la création d'images compatible que je ne saisissait pas ...

    http://java.developpez.com/faq/gui/?...ompatibleImage

    Voila si un modérateur qui passe par là trouve que c'est une mauvaise idée qu'il me prévienne (afin que je ne refasse pas la bêtise si c'en est une).

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

Discussions similaires

  1. [Swing] Icone et couleur transparente
    Par Royd938 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 11/07/2006, 15h13
  2. Définir la couleur de tous les backgrounds
    Par karatepla dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 04/06/2005, 14h54
  3. DirectDraw7: Couleur transparente pas si transparente...
    Par Magus (Dave) dans le forum DirectX
    Réponses: 4
    Dernier message: 01/10/2002, 19h17

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