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 :

[Image] passage du colorspace RGB vers HSL


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Par défaut [Image] passage du colorspace RGB vers HSL
    Bonjour,

    Je suis actuellement en train de programmer une application de traitement d'image qui utilise principalement l'api JAI (java advanced imaging) et j'aurais besoin pour une des opérations que je compte implémenter de travailler non pas en RGB (RVB en français) mais bien en HSL (TSL en français). Seulement je n'arrive pas à faire ce changement de colorspace.

    J'ai essayé ceci d'après ce que j'avais trouvé sur le site de sun (pour l'api JAI - Java advanced imaging), mais à l'execution ça m'envoie dans les roses.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    PlanarImage im = tools.Divers.choose(); //me permet de charger une image
     
    ParameterBlock pb = new ParameterBlock();
    pb.addSource(im);
    ColorModel cm =	new ComponentColorModel(ColorSpace.getInstanceColorSpace.TYPE_HLS),
             new int[] {8},     false,      false,  	Transparency.OPAQUE,     					      DataBuffer.TYPE_BYTE);
     
    pb.add(cm);
    PlanarImage dst = JAI.create("ColorConvert", pb);
     
    tools.Divers.affiche(dst, "test"); //affiche l'image ds une frame

    Quelqu'un aurait-il une solution (JAI ou pas JAI) pour "convertir une image" en HSL (Le but étant de pouvoir par après jouer sur ces 3 paramètres)( --> changer de colorspace)?

    Un grand merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Par défaut Petite aide...
    Pour ceux qui auraient le courage et la gentillesse de réfléchir à mon problème, je vous met le lien de chez sun vers le guide de l'API JAI (chapitre ColorSpaces)

    http://java.sun.com/products/java-me...Color.doc.html

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Par défaut Je continue...
    J'ai continué à travailler la dessus. J'arrive maintenant à mettre une image en niveaux de gris en passant par les colorspaces et la constante cs_gray. Mais comment passer en HSL, car c'est ça mon but !!?

    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
     
     
      PlanarImage im = tools.Divers.chooseP();
        BufferedImage bimg = im.getAsBufferedImage();
        ColorSpace gray_space = ColorSpace.getInstance (ColorSpace.CS_GRAY);
      ColorConvertOp convertToGrayOp = new ColorConvertOp ( gray_space, null);
      //BufferedImage gray_image = convertToGrayOp.filter (source_image, null);
        bimg = convertToGrayOp.filter (bimg, null);
     
      ImageCanvas imagecanvas=new ImageCanvas(bimg);
        JFrame jframe = new JFrame("tada");
        jframe.add(imagecanvas);
        jframe.setSize(400, 400);
        jframe.setVisible(true);
        jframe.isAlwaysOnTop();
        jframe.isResizable();
        jframe.pack();
    J'ai vraiment besoin d'aide ...

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Mais tu comptes faire quoi dans l'espace HSL ?

    Tu peux toujours utiliser une transformation à la main pixel par pixel :

    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
    78
    79
    80
    81
    82
    83
    84
    public static void RGBToHSL(double r, double g, double b, double[] hsl) {
    		if(hsl.length!=3)
    			throw new IllegalArgumentException("HSL.lenght!=3");
    		double red = (r)/255.0;
    		double green = ( g)/255.0;
    		double blue = (b)/255.0;
     
    		double max = MillieUtils.max(blue, red, green);
    		double min = MillieUtils.min(blue, red, green);
     
    		//compute H
    		double h = 0;
    		if(max==min)
    			h=0;
    		else if(max==red)
    			h = ((int) (60.0 * (green-blue)/(max-min))) % 360;
    		else if(max==green)
    			h = ((int)((60.0 * (blue-red)/(max-min) + 120))) % 360;
    		else if(max==blue)
    			h = ((int)((60.0 * (red-green)/(max-min) + 240)))% 360;
    		hsl[0] = h;
     
    		//compute S
    		double s =0;
    		if(max==min)
    			s=0;
    		else if(max+min<=1.0)
    			s = (max-min)/(max+min);
    		else s = (max-min)/(2.0-(max+min));
    		hsl[1] =  s;
     
    		//compute L
    		double l = 0.5*(max+min);
    		hsl[2]=l;
    	}
     
    	public static void RGBToHSL(int rgb, double[] hsl) {
    		RGBToHSL((rgb >> 16) & 0xFF,(rgb >> 8) & 0xFF,rgb & 0xFF, hsl);
    	}
     
    	public static int HSLToRGB(double[] hsl) {
    		double q;
    		double h = hsl[0];
    		double s = hsl[1];
    		double l = hsl[2];
    		int r;
    		int g;
    		int b;
     
    		if(s==0) {
    			r = g = b = (int) (255.0*l);
    		}
    		else {
     
    			if(l<0.5)
    				q = l * (1+s);
    			else
    				q = l+s-(l*s);
     
    			double p = 2*l-q;
    			double hk = h/360.0;
     
    			double dR = hue2rgb(p, q, hk+1.0/3.0);
    			double dG = hue2rgb(p, q, hk);
    			double dB = hue2rgb(p, q, hk -1.0/3.0);
     
    			r = (int) (dR*255.0);
    			g = (int) (dG*255.0);
    			b = (int) (dB*255.0);
    		}
    		int rgb = (r<<16) + (g<<8) + b;
    		return rgb;
    	}
    	private static double hue2rgb(double p, double q, double tc) {
    		if(tc<0) tc+=1;
    		if(tc>1) tc-=1;
    		if(tc<1.0/6.0)
    			return p+((q-p)*6.0*tc);
    		if(tc<1.0/2.0)
    			return q;
    		if(tc<2.0/3.0)
    			return p+((q-p)*6*(2.0/3.0-tc));
    		return p;
    	}
    http://subversion.developpez.com/pro...olorUtils.java
    http://subversion.developpez.com/pro...HSLFilter.java

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Par défaut
    Bonjour millie,

    Merci pour ta réponse.
    En fait je voudrais, comme tu t'en doutes probablement, m'amuser à jouer sur la saturation etc... d'une image pour pouvoir par exemple donner un effet grisâtre à une image mais en faire ressortir un élément rouge vif par exemple.

    Merci aussi pour ton bout de code. Je m'étais aussi dirigé vers la transformation par pixel mais je n'ai pas eu beaucoup de temps à consacrer pour m'y mettre sérieusement. Je n'ai pas encore eu le temps d'insérer ta solution dans mon code (examens obligent...)

    Au sinon j'ai trouvé sur ce très bon site : (qui regorge d'exemple JAI) cette classe :

    https://jaistuff.dev.java.net/code/o....RGBtoIHS.html

    que je compte également adapter et tester dès que j'aurai un peu de temps libre et qui devrait répondre à mes espérances. Je ne sais d'ailleurs pas comment j'ai pu passer à côté tellement j'ai fouillé ce site.

    Un grand merci

Discussions similaires

  1. Réponses: 9
    Dernier message: 15/04/2010, 22h27
  2. Conversion d'une image rgb en hsl
    Par ranell dans le forum Images
    Réponses: 13
    Dernier message: 01/03/2007, 22h03
  3. Réponses: 2
    Dernier message: 24/03/2005, 10h20
  4. Réponses: 2
    Dernier message: 17/02/2005, 13h48
  5. Passage du type integer vers varchar sur clé primaire
    Par GMI dans le forum Bases de données
    Réponses: 2
    Dernier message: 07/01/2005, 09h09

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