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

AWT/Swing Java Discussion :

Image avec arrière plan transparent


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2014
    Messages : 10
    Points : 16
    Points
    16
    Par défaut Image avec arrière plan transparent
    Bonjour,

    Je suis en train de développer un petit programme qui tourne en arrière plan en Java, j'ai décidé d'ajouter un icône dans le systray histoire de pouvoir interagir avec mon programme sans passer par une interface complète ou la ligne de commande. Mon systray fonctionne mais le problème c'est l'icône qui s'affiche en changeant la couleur de l'arrière de transparent à une couleur sous Linux et sous windows.

    J'ai vérifié le profil de couleur (ou espace de couleur comme indiqué sous Gimp) et c'est "Couleur indexée (255 couleurs)" donc normalement si j'ai bien compris la logique en chargeant l'image en mode BufferedImage.TYPE_BYTE_INDEXED (mais j'ai aussi essayé TYPE_INT_ARGB l'arrière est juste blanc et plus noir) ça devrait chargé l'image avec l'arrière plan transparent. Le problème c'est que je ne trouve pas de moyen de changer l'image avec ce type, mais unique la charger puis la recopier sur une BufferedImage qui est sur ce profil de couleur.

    En résumé j'ai ça comme code dans mon main lié à mon TrayIcon :
    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
     
    ...
    String imgIconPath = "chemin/jusqu_a/mon/image/icon32.gif";
    ImageIcon imgIcon = null;
    final TrayIcon trayIcon;
     
    imgIcon = new ImageIcon(imgIconPath);
    Image image = imgIcon.getImage();
    BufferedImage buffImage = new BufferedImage(
    				image.getWidth(null), 
    				image.getHeight(null), 
    				//~ BufferedImage.TYPE_INT_ARGB
    				BufferedImage.TYPE_BYTE_INDEXED
    		);
    Graphics g = buffImage.getGraphics();
    g.drawImage(image, 0, 0, null);
    trayIcon = new TrayIcon(buffImage);
    trayIcon.setImageAutoSize(true);
    final SystemTray tray = SystemTray.getSystemTray();
    tray.add(trayIcon);
    ...
    Si vous voulez un code qui peut être compilé directement je peux le faire, suffit de demander !

    J'aimerai savoir si quelqu'un saurait comment faire en sorte que mon arrière plan soit transparent ?
    Je précise que j'ai cherché sur le net comment charger une image transparente en java et qu'à chaque fois le code malgré sa complexité je l'ai testé mais au mieux j'ai obtenu un passage de la couleur blanche ou noire à un rose.
    J'ai bien dans l'idée qu'il doit être possible de détecter ces pixels qui devrait être transparent pour changer la valeur du alpha qui doit être mauvaise (je l'ai fait il y a quelques mois en C et OpenGL mais c'était assez simple puisque je savais que la structure était un simple tableau à deux dimensions).

    Je suis preneur de toute solution ou même piste, juste là je ne vois plus part où chercher !

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Au lieu de tenter de bidouiller ton image en Java (en fait il faudrait créer une BufferedImage de type TYPE_INT_ARGB, et soit ne dessiner que la partie non transparente, soit remplir la couche alpha (voir getAlphaRaster()) avec les bonnes valeurs (0 pour totallement transparent, 255 pour totallement opaque), ce qui n'est pas forcément évident à faire, en fonction de l'image), pourquoi ne pas créer directement une image transparente sous GIMP (créer un alpha channel, sélectionner les parties à rendre transparentes, et appuyer la touche delete), puis l'enregistrer au format PNG : en chargeant l'image PNG avec ImageIcon dans ton systray, elle sera directement transparente.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2014
    Messages : 10
    Points : 16
    Points
    16
    Par défaut
    Merci de ta réponse joel.drigo !

    Je n'ai pas été très précis sur ce point mais mon image possède déjà un canal alpha et un arrière plan transparent, je n'ai pas besoin de le créer juste d'un moyen pour charger l'image avec ce canal alpha pris en compte et pas un arrière plan colorisé de manière random en fonction de la méthode.

    Nom : icon32.gif
Affichages : 1228
Taille : 1,5 Ko
    Nom : icon32.png
Affichages : 1227
Taille : 1,5 Ko

    J'avais déjà tenté de charger directement un png, sans rien faire de particulier comme tentative de traitement mais sans résultat. Juste pour être sûr j'ai retenté avec les deux méthodes suivante, mais dans les deux cas l'arrière-plan est blanc et pas transparent comme sur mes images sources.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    String imgIconPath = "chemin/jusqu_a/mon/image/icon32.png";
    ImageIcon imgIcon = null;
    final TrayIcon trayIcon;
    imgIcon = new ImageIcon(imgIconPath);
    Image image = imgIcon.getImage();
    trayIcon = new TrayIcon(image);
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    String imgIconPath = "chemin/jusqu_a/mon/image/icon32.png";
    ImageIcon imgIcon = null;
    final TrayIcon trayIcon;
    Image image =null;
    try{
    	image = ImageIO.read(new File(imgIconPath));
    }
    catch(IOException ex)
    {
    	ex.printStackTrace();
    }
    trayIcon = new TrayIcon(image);
    Et donc une petite capture de mon systray sous ubuntu 12.04, en chargeant l'image via l'une ou l'autre des méthode précédente. Et la manière indiqué dans mon premier post c'est la même chose mais avec un arrière plant noir, c'est moins flashie sous ubuntu vu que la barre est gris sombre mais c'est pas top, et sous windows ça fait très sale.
    Nom : Capture du 2014-08-13 09:32:47.png
Affichages : 1191
Taille : 4,8 Ko

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Les deux images apparaissent bien sur fond transparents lorsque je teste sous Windows. Sous Ubuntu, je ne peux pas dire. Par contre, 2 chôses : l'image n'est pas en 16 x 16, donc elle est redimensionnée à la volée (en autosize) et comme la marge est étroite, on ne la voit quasiment pas, ce qui peut donner l'impression qu'il n'y a pas de marges transparentes ; secondement, l'antialiassage n'est pas translucide, ce qui donne un effet de bordure noire ce qui est peut être "l'effet sale" dont tu parles.


    EDIT : il y a un bug signalé au sujet de la transparence des icônes de systray : http://bugs.java.com/bugdatabase/vie...bug_id=6453521. Quelqu'un a crée une lib de contournement à partir d'images SVG :
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2014
    Messages : 10
    Points : 16
    Points
    16
    Par défaut
    En effet si c'est un bug connu de java ça m'étonne pas que j'arrive pas à obtenir le bon résultat avec un png ou un gif. J'ai bien retesté sous windows et j'ai en effet la transparence moi aussi avec un chargement sans aucune tentative de traitement (j'ai fait tellement de test que j'ai dû confondre avec un autre test et pas tester le chargement direct comme actuellement sous windows)

    Merci pour la lib pour un charger des svg je vais me pencher là dessus

    Merci de ton aide joel.drigo !

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

Discussions similaires

  1. Texte avec arrière plan transparent
    Par papyxy dans le forum VBScript
    Réponses: 2
    Dernier message: 23/05/2013, 17h07
  2. Widget avec arrière-plan transparent
    Par Invité dans le forum Qt
    Réponses: 9
    Dernier message: 11/04/2011, 15h19
  3. probleme de mettre une image en arriére-plan avec le JFrame
    Par fateh_mansori dans le forum NetBeans
    Réponses: 4
    Dernier message: 21/03/2010, 20h12
  4. Réponses: 3
    Dernier message: 27/11/2008, 16h50

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