OVH Cloud OVH Cloud

faire s'illuminer une icone ...

5 réponses
Avatar
Arnaud
hello !

j'utilise pour une application des JLabel avec une icone : quand je passe
dessus avec la souris, l'image change de couleur et le curseur se
transforme en main pour indiquer à l'utilisateur qu'une action est
possible.

Mon problème est que je ne suis pas un as en manipulation des données RGB.
J'utilise un filtre pour changer l'image du label, mais je ne sais rien
faire d'autre qu'inverser les couleurs :

class FiltreNegatif extends RGBImageFilter {

public FiltreNegatif () {
canFilterIndexColorModel = true;
}

public int filterRGB (int x, int y, int rgb) {
int alpha = rgb & 0xFF000000;
// Transformation des composants RGB en leur inverse
int rougeInverse = (rgb & 0xFF0000) ^ 0xFF0000;
int vertInverse = (rgb & 0x00FF00) ^ 0x00FF00;
int bleuInverse = (rgb & 0x0000FF) ^ 0x0000FF;
return alpha | rougeInverse | vertInverse | bleuInverse ;
}
}

Comment faire un effet de type icone qui s'illumine au passage de la souris
?

Quelqu'un sait-il aussi comment faire un effet à la KDE : un périmètre en
pointillé apparait un court instant après le clic ?

merci d'avance

--
Arnaud

5 réponses

Avatar
oliv
Arnaud wrote:
Comment faire un effet de type icone qui s'illumine au passage de la souris?


Tu pourrais essayer une transformation comme :

public int filterRGB (int x, int y, int rgb) {
int alpha = rgb & 0xFF000000;
int rouge = (rgb & 0x00FF0000) >> 16;
int vert = (rgb & 0x0000FF00) >> 8;
int bleu = (rgb & 0x000000FF);

rouge = Math.max(255, (int)(rouge * 1.3) );
vert = Math.max(255, (int)(vert * 1.3) );
bleu = Math.max(255, (int)(bleu * 1.3) );

return alpha | rouge << 16 | vert << 8 | bleu ;
}
}

ou de multiples manips sur les RGB.

Et aussi, en utilisant une Color intermédiaire, tu pourrais avoir
accès à une routine comme lighter() ou faire des manips dans l'espace
Teinte-Saturation-Lumière en faisant une conversion RGBtoHSB() puis
modif puis retour RGBtoHSB().

--
oliv

Avatar
Arnaud
merci, j'ai pu obtenir quelques résultats intéressants mais mes images ont
un fond transparent : lorsque je modifie la clarté, le fond ne reste pas
transparent (il devient blanc ou noir ou d'une autre couleur), ce qui est
visuellement pas beau du tout !

Comment utiliser la fonction brighter(), ou une modification de la
brightness via le système HSB, sans toucher au caractère transparent de mon
fond d'image ?

--
Arnaud
Avatar
oliv
Arnaud wrote:
merci, j'ai pu obtenir quelques résultats intéressants mais mes images ont
un fond transparent : lorsque je modifie la clarté, le fond ne reste pas
transparent (il devient blanc ou noir ou d'une autre couleur), ce qui est
visuellement pas beau du tout !


Au passage, je corrige une grosse erreur : ça n'était pas Math.max()
mais bien-sûr min()...

Ce qui donne corrigé :
public int filterRGB (int x, int y, int rgb) {
int alpha = rgb & 0xFF000000;
int rouge = (rgb & 0x00FF0000) >> 16;
int vert = (rgb & 0x0000FF00) >> 8;
int bleu = (rgb & 0x000000FF) >> 0;

rouge = Math.min(255, (int)(rouge * 1.3) );
vert = Math.min(255, (int)(vert * 1.3) );
bleu = Math.min(255, (int)(bleu * 1.3) );

return alpha | rouge << 16 | vert << 8 | bleu ;
}

Ou alors on peut simplement borner les valeurs par
rouge = (int)(rouge * 1.3) & 0xFF;

Pour le phénomène alpha, j'ai codé un petit essai et je n'observe pas
ça : ce qui est transparent le reste bien.

Cela était-il dû à l'erreur précédente ?

Sinon, cela pourrait-il être dû à une implémentation système
dépendante ? (Je suis sous Mac OS X.3)

Comment utiliser la fonction brighter(), ou une modification de la
brightness via le système HSB, sans toucher au caractère transparent de mon
fond d'image ?
Désolé, là encore je n'observe pas ça.


Si tu veux m'envoyer un bout de code et une icone d'exemple, je
pourrais vérifier.

Ma vraie adresse est @online.fr

--
oliv

Avatar
Arnaud
merci beaucoup, ça marche impecc maintenant !

--
Arnaud
Avatar
oliv
Arnaud wrote:
merci beaucoup, ça marche impecc maintenant !
:-)


--
oliv