Filtre de l'affichage : HELP!

rmorvill Messages postés 17 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 19 mai 2005 - 18 mai 2005 à 09:37
rmorvill Messages postés 17 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 19 mai 2005 - 19 mai 2005 à 10:56
bonour

je souhaiterai afficher un filtre devant mon application qui permettrai de rougir tout l'affichage.

cela sera un mode de vision de nuit.

est-il possible de changer le contraste de l'affichage?

merci de vos réponses

rmorvill

4 réponses

cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
19 mai 2005 à 01:40
Il y a bien des méthodes comme dessiner sur une image et filtrer les
couleurs, ou alors filtrer en utilisant un ColorSpace et un ColorModel
construits à la main, mais ce sont des méthodes qui sont super lentes
si elles doivent être effectuées en continue (comme tous les pixels
sont traités 1 par 1). Par contre, elle peuvent être utilisées pour
créer une fois pour toute une version "rouge" de quelques images.



Je ne connais aucune méthode suffisamment rapide pout être utilisable en continue.



J'en profite pour rajouter une question (si quelqu'un d'autre lit ce message )



Quelqu'un sait-il comment définir le ColorModel utilisé par un java.awt.Component ?

la méthode getColorModel() existe, mais pas setColorModel :)





Je te donne en exemple 2 classes : un JPanel modifié qui affiche une
image préalablement filtrée, et le ColorSpace correspondant à un filtre
pour le rouge.

<hr size="2" width="100%">class MonPanel extends JPanel {

Image imageFiltree;//ce sera l'image une fois filtrée



public void paintComponent(Graphics g) {

super.paintComponent(g);

if (imageFiltree == null) {//pour éviter de filtrer plusieurs fois :S

Image source = (new
ImageIcon("/home/florent/Kirika starbée.png")).getImage();//tu
changeras le chemin :D

imageFiltree = filtrerImage(source);

}

g.drawImage(imageFiltree, 0, 0, null);



}



public Image filtrerImage(Image source) {

int w = source.getWidth(null);

int h = source.getHeight(null);

Image icon = this.createImage(w, h);



//On créé un ColorSpace, et un ColorModel correspondant

MonColorSpace cp = new MonColorSpace();

ComponentColorModel cm = new ComponentColorModel(cp,
false, false, java.awt.Transparency.OPAQUE, DataBuffer.TYPE_USHORT);

//le premier false signifie qu'il n'y a pas de composante transparente dans notre ColorModel

//le second est aussi lié à la composante alpha

//le paramètre Transparancy indique que le Model ne
doit être utilisé que dans des cas où il n'y a pas de transparence

//enfin, le type ushort signifie que les composantes
dans notre modèle seront stoquées sur des short non signés





//on créé une image qui va permettre de faire le filtrage

BufferedImage buffered = new BufferedImage(cm, cm.createCompatibleWritableRaster(w, h), false, null);

//en dessinant l'image à filtrer sur buffered, il
fait appel aux méthodes de conversions du ColorSpace (c'est l'étape
longue)

buffered.getGraphics().drawImage(source, 0, 0, w, h, 0, 0, w, h, null);



//juste pour retourner une Image classique en sortie

icon.getGraphics().drawImage(buffered, 0, 0, w, h, 0, 0, w, h, null);



return icon;



}

}





//Cet espace de couleur est monochrome. Pour faire simple, je le base
sur un espace en niveau de gris déjà existant (en fait, je ne sais pas
si c'est nécessaire....).

class MonColorSpace extends ColorSpace {



ColorSpace gray;



public MonColorSpace() {

super(ColorSpace.CS_GRAY, 1);//le 1 signifie que
notre espace de couleur n'a qu'une seule composante (pas besoin de plus
!)

gray = ColorSpace.getInstance(ColorSpace.CS_GRAY);

}



public float[] fromCIEXYZ(float[] colorvalue) {

return gray.fromCIEXYZ(colorvalue);

}



//Notre unique couleur, qui sera retranscrite en rouge dans le
model rgb, correspond en fait à la valeur en niveaux de gris.

public float[] fromRGB(float[] rgbvalue) {

return new float[] {0.3f * rgbvalue[0] + 0.59f * rgbvalue[1] + 0.11f * rgbvalue[2]};

//Le tableau à une longueur de 1 comme on a qu'une composante

//Les coefficients sont là juste pour que ce soit
plus beau :) On pourait juste faire la moyenne des 3 composantes.

//C'est cette étape qui est lente !!!

}



public float[] toCIEXYZ(float[] colorvalue) {

return gray.toCIEXYZ(colorvalue);

}



public float[] toRGB(float[] colorvalue) {

return new float[] {colorvalue[0], 0, 0}; //
ici, on retourne la valeur RGB qui nous intéresse : tout sur la
composante rouge, rien sur les autres :)

//Pour teinter dans une autre couleur, on pourrait par exemple faire :

//return new float[] {colorvalue[0], 0.5f*colorvalue[0], 0};

}



}



<hr size="2" width="100%">

Bonne prog


Dobel, oups, déjà 1h30 du mat...
[Une fois rien,
c'est rien; deux fois rien, ce n'est pas beaucoup, mais pour trois fois
rien, on peut déjà s'acheter quelque chose, et pour pas cher]
0
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
19 mai 2005 à 01:42
désolé pour les problèmes d'espacement dans le message, mais ça ne vient pas de moi....

un problème technique ??

(même ma signature a les espaces chamboulés...)

Dobel
[Une
fois rien, c'est rien; deux fois rien, ce n'est pas beaucoup, mais pour
trois fois rien, on peut déjà s'acheter quelque chose, et pour pas cher]
0
cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
19 mai 2005 à 02:07
Arf, j'avais pas vu ton autre message aussi.

J'ai pe répondu totalement à côté de la plaque

Dobel
[Une
fois rien, c'est rien; deux fois rien, ce n'est pas beaucoup, mais pour
trois fois rien, on peut déjà s'acheter quelque chose, et pour pas cher]
0
rmorvill Messages postés 17 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 19 mai 2005
19 mai 2005 à 10:56
merci de ton aide..

aurais tu une idée pour l'autre topic,

il faut que je fasse un filtre rouge devant mon application pour faire un mode nightVision,


c'est très,très important!

merci de ton aide.

rmorvill
0