# Java > Interfaces Graphiques en Java > AWT/Swing >  BufferedImage et les espaces de couleurs (ColorSpace)

## ToTo13

Bonjour,

je travaille depuis quelques temps sur des images couleurs et j'utilisais des BufferedImage de type TYPE_INT_RGB.

Mais voil, mes recherches me poussent  devoir travailler dans des espaces de couleur comme HLS, HSV et YCbCr.
En regardant dans la JavaDoc, j'ai vu que l'on pouvait spcifier un ColorModel lors de la cration d'un BufferedImage, auquel on pourrait ventuellement spcifier un autre espace de couleur que RGB. C'est justement ce qui m'intresse.

Mais tout ceci me semble plutt compliqu et je souhaitais savoir s'il y avait des classes permettant de modifier plus ou moins automatiquement l'espace des couleurs ?

 - Si oui, pourriez vous m'aider ?
 - Si non, est ce vous pourriez m'aider  crer des images dans l'espace de couleur que je souhaite ? Et surtout, comment ensuite accder aux pixels (lecture/criture), car certains espaces sont cods sur [0...1] et non plus sur des entiers.


Merci par avance.

----------


## pseudocode

> Mais voil, mes recherches me poussent  devoir travailler dans des espaces de couleur comme HLS, HSV et YCbCr.
> En regardant dans la JavaDoc, j'ai vu que l'on pouvait spcifier un ColorModel lors de la cration d'un BufferedImage, auquel on pourrait ventuellement spcifier un autre espace de couleur que RGB. C'est justement ce qui m'intresse.


Il y a deux aspects  prendre en compte:

- la classe ColorModel sert  convertir un champ de bits ( dpendant du format de stockage de l'image ) reprsentant un pixel en composantes et rciproquement. Elle sert donc principalement  gerer le format "binaire" des donnes.

- la classe ColorSpace qui sert a convertir une valeur RGB ou XYZ dans l'espace de couleur propre au ColorSpace. Elle sert donc principalement a pouvoir passer dans une reprsentation commune (RGB ou XYZ).

Pour ton problme, il faut commencer par rcuprer une instance de ColorSpace (gnralement depuis une instance de ICC_Profile), crer une instance de ColorModel utilisant le ColorSpace, puis crer la BufferedImage en utilisant le ComponentColor.

On peut alors utiliser des operateurs comme "ColorConvertOp" pour passer d'une BufferedImage classique (RGB) dans la BufferedImage qu'on vient de crer.

----------


## ToTo13

Bonjour,

et merci pour ces informations, je viens de regarder tout cela.

Rcuprer le ColorSpace ok, mais pour la cration du ColorModel... il y a certaines informations que je matrise plutt mal  ::(: . Le constructeur a la forme suivante : ColorModel(int pixel_bits, int[] bits, ColorSpace cspace, boolean hasAlpha, boolean isAlphaPremultiplied, int transparency, int transferType).
 - pixel_bits = nombre de bits servant  coder un pixel.
 - int[] bits = nombre de bits par canal.
Mais comment est ce que cela est stock exactement ? Car j'en ai besoin pour savoir quelles valeurs attribuer.
Je m'explique : certains espaces codent sur [0..1], voire sur [-1...1], donc des rels. Est ce la mme chose dans un BufferedImage ?
Auquel cas il faudrait que je passe le nombre de bits codant un double pour chaque canal. Or lors de la rcupration des valeurs des pixels, on peut utiliser les mthodes suivantes :
 - getRaster().getSample(x, y, Channel)
 - getRaster().getSampleDouble(x, y, Channel)
Mais, la valeur est la mme, seul le type change : par exemple on rcupre pour une image en niveaux de gris 170 et 170.0. Ce qui laisserait penser que la valeur est entire et simplement convertie en Double lors du getSampleDouble.

----------


## pseudocode

> Bonjour,
> 
> et merci pour ces informations, je viens de regarder tout cela.
> 
> Rcuprer le ColorSpace ok, mais pour la cration du ColorModel... il y a certaines informations que je matrise plutt mal . Le constructeur a la forme suivante : ColorModel(int pixel_bits, int[] bits, ColorSpace cspace, boolean hasAlpha, boolean isAlphaPremultiplied, int transparency, int transferType).
>  - pixel_bits = nombre de bits servant  coder un pixel.
>  - int[] bits = nombre de bits par canal.
> Mais comment est ce que cela est stock exactement ? Car j'en ai besoin pour savoir quelles valeurs attribuer.
> Je m'explique : certains espaces codent sur [0..1], voire sur [-1...1], donc des rels. Est ce la mme chose dans un BufferedImage ?
> ...


C'est  toi d' "expliquer" comment sont stockes les donnes binaires = c'est  toi de coder les methodes du ColorModel. 

Mais bon, pas de panique !  ::aie:: 

Si ton format de stockage est standard, tu as des implmentations de ColorModel existantes. Par exemple "ComponentColorModel", qui te permet de spcifier un colormodel avec "n" bits par composante, le tout stock dans un tableau linaire.

Exemple usuel: chaque pixel est constitu de 3 composantes de 8 bits, le tout stock dans un tableau byte[]


```

```


Le 1er parametre, myColorSpace, indique l'instance du ColorSpace qui sera utilis (par exemple pour "afficher" dans un label, ou par les oprateurs).

----------


## ToTo13

> C'est  toi d' "expliquer" comment sont stockes les donnes binaires = c'est  toi de coder les methodes du ColorModel. 
> 
> Mais bon, pas de panique ! 
> 
> Si ton format de stockage est standard, tu as des implmentations de ColorModel existantes. Par exemple "ComponentColorModel", qui te permet de spcifier un colormodel avec "n" bits par composante, le tout stock dans un tableau linaire.
> 
> Exemple usuel: chaque pixel est constitu de 3 composantes de 8 bits, le tout stock dans un tableau byte[]
> 
> 
> ...


Merci :-)
Mais a n'a vraiment pas l'air gagn pour stocker des doubles sur [-1,1]. En plus il faut mettre des vrifications car dans les images classiques, si on rentre 256 pour un TYPE_BYTE_GRAY, cela met 0 au pixel.

Je pensais que le format avait t prvu et que c'tait dj existant. ::pleure:: 
Je crois que je vais me contenter de faire des conversions pixel  pixel et au cas o si je dois faire plusieurs calculs un peu lourds, travailler directement avec des tableaux de Double[width, height, nbChannels]. ::cry:: 

Merci pour ton aide.

----------


## pseudocode

Hum. A mon avis je n'ai pas compris ce que tu voulais faire.  ::aie:: 
- Stocker des double dans le raster ?
- Convertir les bits du raster en double ?

 ::koi::

----------


## ToTo13

En bref, je voulais savoir si on pouvait appeler une mthode (ou la programmer si c'tait possible et pas monstrueux) qui convertisse un BufferedImage RBG aux formats HLS, HSV (HSB), YCbCr (YUV), CIELab tout en gardant la classe BufferedImage.

Car certains des espaces de couleurs que je souhaite utiliser ont un codage sur [-1,1], [0,360], etc. et non pas sur [0...255] ou [0...65535].

----------


## pseudocode

> En bref, je voulais savoir si on pouvait appeler une mthode (ou la programmer si c'tait possible et pas monstrueux) qui convertisse un BufferedImage RBG aux formats HLS, HSV (HSB), YCbCr (YUV), CIELab tout en gardant la classe BufferedImage.


oui, en crant ta propre instance de ColorSpace.




> Car certains des espaces de couleurs que je souhaite utiliser ont un codage sur [-1,1], [0,360], etc. et non pas sur [0...255] ou [0...65535].


oui aussi, en crant ta propre instance de ColorModel.

Je vais essayer de coder vite fait un exemple.  ::P:

----------


## ToTo13

> Je vais essayer de coder vite fait un exemple.


 ::hola::  Oh grand manitou  ::ccool:: 
Juste un petit exemple, aprs je fais tout a comme un grand  ::D:

----------


## pseudocode

Bon, voila un exemple d'une BufferedImage utilisant un ColorSpace HSV, ou chacune des 3 composantes est un "float".

Le Colorspace


```

```


Cration d'une BufferedImage utilisant un ColorModel de type float sur ce ColorSpace


```

```


Exemple d'utilisation pour copier une BufferedImage JPG "classique" dans cette nouvelle BufferedImage.


```

```

----------


## ToTo13

Merci INFINIMENT, je vais regarder tout cela en dtail et faire tout ce qu'il faut.

Petite question annexe (et oui, une de plus) : si je souhaite convertir de RGB vers YCbCr, je sais qu'il y a deux normes possibles (CIE 601 et 709). Sais tu qu'elle est la norme qui est utilise pour la conversion si j'utilise le code que tu viens de me donner (en l'adaptant  YUV bien entendu) ?

----------


## pseudocode

> Petite question annexe (et oui, une de plus) : si je souhaite convertir de RGB vers YCbCr, je fais qu'il y a deux normes possibles (CIE 601 et 709). Sais tu qu'elle est la norme qui est utilise pour la conversion si j'utilise le code que tu viens de me donner (en l'adaptant  YUV bien entendu) ?


Heu... j'ai (encore) pas compris.  ::aie:: 

Tu mets les formules que tu veux dans ta classe ColorSpace (dans les 2 mthodes fromRGB() et toRGB()).

----------


## millie

Les perfs. ne sont ils pas compltement plombs avec un espace de couleur maison HSL en cas d'application d'un oprateur standard ?

----------


## pseudocode

> Les perfs. ne sont ils pas compltement plombs avec un espace de couleur maison HSL en cas d'application d'un oprateur standard ?


Si, bien sur. Les oprateurs "standards" utilisent soient la reprsentation RGB ou XYZ, et doivent donc passer par les 2 fonctions correspondantes du ColorSpace. Dans mon exemple ci dessus, si j'avais utilis "ColorConvertOp" pour copier une image d'ans l'autre les perfs seraient catastrophiques : pour chaque pixel on fait la conversion (RGB) -> XYZ -> (RGB -> HSV)  ::aie:: 

Mais bon, si on cre son propre ColorSpace/ColorModel c'est gnralement qu'on veut faire des traitements spcifiques, donc on crera ses propres oprateurs.

----------


## ToTo13

Merci pour les explications.
Ma question tait : je vais mettre les formules pour la conversion dans le ColorSpace, ok. Mais aprs, lorsque je vais entrer des valeurs au format YCbCr. Est ce qu'elles vont repasser dans les conversions ou tre stockes directement ?
Parce que si je dois continuer  entrer les valeurs au format rgb et que le colorspace les converties  chaque affectation, je n'ai aucun intrt  utiliser tout ce systme, mieux vaut travailler avec des tableaux de doubles.

----------


## pseudocode

> Merci pour les explications.
> Ma question etait : je vais mettre les formules pour la conversion dans le ColorSpace, ok. Mais aprs, lorsque je vais entrer des valeurs au format YCbCr, est ce qu'elles vont repasser dans les conversions ou tre stockes directement ?


Les donnes sont toujours stockes dans ton format (YCbCr) dans le Raster.

Donc si tu utilises les mthodes de BufferedImage.getRaster(), ca fait une simple copie des valeurs. Mais si tu utilises les mthodes de BufferedImage (genre setRGB()) alors ca passe par les fonctions de conversion du ColorSpace avant d'aller dans le Raster.

----------


## ToTo13

Merci c'est parfait, c'est ce que je voulais.
Je vais faire tous les tests ncessaires :-)

----------


## ToTo13

Bonsoir,

je viens de tester et tout fonctionne parfaitement, c'est exactement ce que je cherchais.

J'ai tout de mme des questions de clarification (j'aime bien comprendre ce que je fais).

 - 1 - Lorsque tu fais "ColorSpace.getInstance(ColorSpace.CS_sRGB)", tu rcupres une instance du ColorSpace, mais pourquoi CS_sRGB ?
J'ai essay aussi avec CS_LINEAR_RGB et les rsultats sont similaires. Pourquoi ?
Qu'elle est exactement la diffrence car pour l'instant tout ce que je vois est identique :-(.


 - 2 - Lorsque l'on instancie le ColorModel, on passe DataBuffer.TYPE_FLOAT. Mais on peut aussi passer TYPE_DOUBLE. Mais lorsque l'on cre notre propre classe du ColorSpace que l'on passe au ColorModel , les arguments des mthodes (entre/sortie) sont tous des float.
Donc on peut se demander  quoi sert de type TYPE_DOUBLE,  moins que l'on puisse surcharger les mthodes ?

----------


## pseudocode

> - 1 - Lorsque tu fais "ColorSpace.getInstance(ColorSpace.CS_sRGB)", tu rcupres une instance du ColorSpace, mais pourquoi CS_sRGB ?
> J'ai essay aussi avec CS_LINEAR_RGB et les rsultats sont similaires. Pourquoi ?
> Qu'elle est exactement la diffrence car pour l'instant tout ce que je vois est identique :-(.


CS_sRGB (espace sRGB) est un espace non linaire (gamma ~= 2.2 ). C'est le colorspace habituel utilis par les crans LCD/CRT. C'est galement celui utilis dans les fichiers images rcents (jpeg2000, png, ...). 

C'est galement celui utilis "nativement" dans Java. C'est  dire que les mthodes "toRGB()/fromRGB()" de CS_sRGB ne modifient pas les valeurs.

On peut donc simplement "copier" directement les valeurs d'un jpeg2000/png dans le raster, ca revient au meme que de passer par ce colorspace qui ne fait rien  ::mrgreen:: .

CS_LINEAR_RGB est un espace linaire. Les mthodes "toRGB()/fromRGB()" de CS_LINEAR_RGB font donc la transformation gamma afin de fournir des valeurs sRGB.



```

```





> - 2 - Lorsque l'on instancie le ColorModel, on passe DataBuffer.TYPE_FLOAT. Mais on peut aussi passer TYPE_DOUBLE. Mais lorsque l'on cre notre propre classe du ColorSpace que l'on passe au ColorModel , les arguments des mthodes (entre/sortie) sont tous des float.
> Donc on peut se demander  quoi sert de type TYPE_DOUBLE,  moins que l'on puisse surcharger les mthodes ?


C'est vrai que l'interface de ColorSpace ne prend en compte que des "float". Si tu veux plus de prcision, il va falloir surcharger les mthodes et galement rcrire tes propres oprateurs pour qu'ils utilisent la dfinition de la classe et pas celle de l'interface.

----------


## Jack Sparrow

Pour rcapituler ce que tu dis (voir si j'ai bien compris) :

Pour sRGB et linearRGB, on a des valeurs pour chaque canaux qui vont de 0  255.
La diffrence tant que certaine zone sont plus tales dans sRGB (a priori les zones clairs).

Quand je lis la spc. de BufferedImage pour get/setRGB, je vois que l'on travaille en fait toujours en sRGB.
Du coup, ma question est : Quand utilise-t'on le ColorSpace LinearRGB ?

----------


## pseudocode

> Pour sRGB et linearRGB, on a des valeurs pour chaque canaux qui vont de 0  255.


Dans la thorie c'est entre 0 et 1. La quantification intervient aprs (dpend du nb de bits par composantes).




> La diffrence tant que certaine zone sont plus tales dans sRGB (a priori les zones clairs).


Hum... En fait, on ne peut pas vraiment "comparer". Afficher une image sRGB dans un espace RGB ca n'a pas de sens. Ce sont deux espaces de reprsentation qui n'ont pas de rapport, si ce n'est le nom des composantes. 

Effectivement, ca fait moins moche d'afficher sRGB dans RGB que dans HSL ou Lab !  ::aie::   Mais normalement, ca ne se fait pas.




> Quand je lis la spc. de BufferedImage pour get/setRGB, je vois que l'on travaille en fait toujours en sRGB.
> Du coup, ma question est : Quand utilise-t'on le ColorSpace LinearRGB ?


On doit spcifier le ColorSpace  la cration de l'image, pour indiquer le format des donnes utilises dans le "Raster" (donnes lues/ecrites dans le buffer). Les mthodes get/setRGB s'occupent de convertir ces donnes  la vole en sRGB, qui est le colorspace standard de Java.

Donc, on peut utiliser le colorSpace LinearRGB si on rcupre un buffer dont les donnes sont des composantes RGB linaires. 

Par exemple si on rcupre un buffer en CIE XYZ  et qu'on le convertit en RGB par multiplication de matrice, on obtient des donnes en RGB linaires.

Mais gnralement, on transforme "a la main" les donnes RGB linaire en sRGB et on stocke tout dans un Raster au format sRGB, afin d'acclrer les accs par get/setRGB (format natif).

----------


## Jack Sparrow

> On doit spcifier le ColorSpace  la cration de l'image, pour indiquer le format des donnes utilises dans le "Raster" (donnes lues/ecrites dans le buffer). Les mthodes get/setRGB s'occupent de convertir ces donnes  la vole en sRGB, qui est le colorspace standard de Java.
> ).


En fait, a, j'avais bien compris. Mais ma question tait plutt : Pourquoi utiliser un ColorSpace RGB linaire et qui l'utilise ?
Dans quel cas est-ce utile ?

----------


## pseudocode

> En fait, a, j'avais bien compris. Mais ma question tait plutt : Pourquoi utiliser un ColorSpace RGB linaire et qui l'utilise ? Dans quel cas est-ce utile ?


Bah, tu l'utilises si les donnes "brutes" sont en RGB linaires  ::aie:: 

C'est vrai que ca n'arrive plus trs souvent maintenant, la plupart des images a 3 composantes rouge/vert/bleu sont nativement en sRGB (appareils photos, web, ...). 

Il me semble que les vieux formats Apple ou Adobe sont en RGB linaire, mais ils ne doivent plus tre tellement utiliss.

----------


## ToTo13

Bonjour,

merci pour ces prcisions.

Je vais donc utiliser sRGB.

Je me doutais que l'on pouvait surcharger les mthodes, mais de quels oprateurs parles tu ?
Et comment les rcrire si je souhaite (et c'est le cas) vraiment utiliser des Double plutt que des Float ?

----------


## pseudocode

> Je me doutais que l'on pouvait surcharger les mthodes, mais de quels oprateurs parles tu ?


Les classes qui se terminent par "Op" dans le package java.awt.image:
- RescaleOp
- ConvolveOp
- ...

En gros, a chaque fois que l'image de dpart et l'image de destination ne sont pas dans le meme colorspace, ces oprateurs utilisent l'operateur "ColorConvertOp" pour passer par le format "XYZ". Donc ca coute cher. 




> Et comment les rcrire si je souhaite (et c'est le cas) vraiment utiliser des Double plutt que des Float ?


Il faut crer tes propres implmentations, en implmentant les interface BufferedImageOp et/ou RasterOp.

----------


## chacha55

> Pour ton problme, il faut commencer par rcuprer une instance de ColorSpace (gnralement depuis une instance de ICC_Profile)



Bonjour,

C'est exactement ce que j'essaie de faire depuis un moment, sans succs...
Donc, je profite de ce poste parce que a n'a pas l'air de vous poser de problmes  tous les deux.

Voil, je voudrais crer une couleur (instance de la classe Color de java)  partir de coordonnes du systme CIELab. Donc, j'ai pens  utiliser un profil ICC. Il me semble que c'est possible mais je n'arrive pas  le mettre en place et je ne trouve AUCUN exemple de code.

Voici mes essais:


```

```


J'ai tlchargr le profil en question sur le site de l'ICC et je l'ai concatn avec un entte de profil trouv sur le mme site.
Voici  quoi ressemble le fichier lu par java (je l'ai coup un peu pour que a rentre dans le poste mais il contient bien les 1617 couleurs):


```

```

Manifestement, je n'ai pas compris quel est le format attendu (peut-tre ne faut-il que l'une des deux parties? J'ai essay mais sans succs encore une fois... ou alors il manque des bouts?) ou alors la syntaxe du code java est errone.
L'erreur renvoye est:


```

```

Si vous avez une solution ou un bon tuto sur le sujet, ce serait super!
Merci d'avance pour votre aide!

----------


## pseudocode

Le constructeur de ICC_Profile n'accepte que des donnes au format ICC.1:2001 (= format binaire, pas texte).

----------


## chacha55

Merci pour cette rponse rapide!

Ou pourrais-je trouver ce genre de fichier?
Aurais-tu une adresse ou un bout d'exemple que je pourrais adapter, stp ?


Et si quelqu'un connais des bons tutos ou doc sur ce sujet, je suis toujours preneuse...!



D'avance merci, et bonne journe!

----------


## pseudocode

Ton problme est vraiment celui l ?




> Voil, je voudrais crer une couleur (instance de la classe Color de java)  partir de coordonnes du systme CIELab


Ou alors tu cherches  obtenir une couleur donne contenue dans ton fichier IT8 (texte) ?

----------


## chacha55

> Ton problme est vraiment celui l ?


Oui, oui mon problme est vraiment celui-l.
Je m'y prends peut-tre pas par le bon bout, c'est tout.
a fait quand mme un bon moment que je cherche et je n'arrive pas non plus  trouver de bons exemples ou conseils  ce sujet.

J'ai russit  crer une couleur (toujours une instance de la classe Color java)  partir de coordonnes xyz en faisant comme a:


```

```

J'aimerais faire quelque chose de similaire  partir de coordonnes CIELab.
Mais si je fais:


```

```

a ne marche pas parce que ce ColorSpace n'est pas dfinit.

J'ai bien vu dans tes rponses que l'on peut crer un ColorSpace.
Je pense pouvoir y arriver, je suis aussi en train d'essayer en parallle.

Mais ce qui me gne, c'est que la conversion "aller-retour" (RVG->CIELab->RVB) ne serait pas totalement exacte il me semble.
Donc, j'ai pens que je pourrais utiliser un systme standardis, et c'est l que je me suis oriente vers les profils ICC.

Ce n'est peut-tre pas la bonne mthode. Mais, je ne trouve pas beaucoup d'aide  ce sujet (je sais je me rpte) donc, j'explore un peu toutes les pistes  ttons...
Pourtant, je suis sre que pleins de gens se sont dj pos les mmes questions!


Merci d'avance pour vos conseils!

----------


## pseudocode

Le plus simple c'est de calculer la couleur en passant par les formules de conversion LAB->XYZ, puis XYZ->sRGB.

Les formules sont dispo sur easyrgb.

Exemple:


```

```



Petite animation montrant les couleurs LAB pour diffrentes valeurs de L.

----------


## ToTo13

Bonsoir,

je relance cette discussion, car j'ai encore des besoins dans le domaine.

Je souhaite cette fois-ci crer une BufferedImage avec un DataBuffer de type Double ou Float, mais comportant de 1  3 canaux.

Si j'utilise la version dcrite prcdemment :


```

```

j'aurai  ce moment l deux soucis :
 - 1 - si je fais une image double, avec cette mthode je dois crer mon propre ColorSpace qui lui ne gre QUE des float => toutes mes valeurs lors du passage vers le ColorSpace seront donc transforme de Double en Float.
 - 2 - Je n'ai gre qu'un seul canal, or je souhaiterai en grer N.

Est ce que quelqu'un saurait comment faire svp ?
Merci par avance.

----------


## ToTo13

Petite rectification : il semblerait qu'il y ait en fait trois canaux par dfaut et non 1.

----------


## pseudocode

> j'aurai  ce moment l deux soucis :
>  - 1 - si je fais une image double, avec cette mthode je dois crer mon propre ColorSpace qui lui ne gre QUE des float => toutes mes valeurs lors du passage vers le ColorSpace seront donc transforme de Double en Float.


Effectivement, ColorSpace ne gre QUE des floats.




> - 2 - Je n'ai gre qu'un seul canal, or je souhaiterai en grer N.
> 
> Petite rectification : il semblerait qu'il y ait en fait trois canaux par dfaut et non 1.


Il y a autant de canaux que dfini dans ton instance de ColorSpace, via le constructeur *ColorSpace(int type, int numcomponents)*.

----------


## ToTo13

> Effectivement, ColorSpace ne gre QUE des floats.[/COLOR])[/B].


Donc si je souhaite crer une image Double, je ne pourrais jamais passer par le ColorSpace sans perdre en information et donc je devrai uniquement travailler par le DataBuffer.
Est ce bien cela ?





> Il y a autant de canaux que dfini dans ton instance de ColorSpace, via le constructeur *ColorSpace(int type, int numcomponents)*.


Oups...  ::arf::  j'ai mal lu la JavaDoc. Mea Culpa ::sm::

----------


## pseudocode

> Donc si je souhaite crer une image Double, je ne pourrais jamais passer par le ColorSpace sans perdre en information et donc je devrai uniquement travailler par le DataBuffer.
> Est ce bien cela ?


ColorSpace est une classe abstraite. Il faut forcment la spcialiser en une classe concrte.

C'est vrai qu'il faut implmenter to/from CIEXYZ/RGB qui utilisent des floats, mais tu peux y ajouter tes propres mthodes to/from qui grent des doubles. 

Bien sur, les oprateurs standards ne greront pas ces nouvelles mthodes et donc tu devras crer des oprateurs spcifiques.

----------


## ToTo13

mmm... comme j'ai l'habitude de travaille directement dans le DataBuffer, je pense que je vais crer un ColorSpace neutre en float qui en fait ne sera jamais utilis.

Merci.

----------


## pseudocode

> mmm... comme j'ai l'habitude de travaille directement dans le DataBuffer, je pense que je vais crer un ColorSpace neutre en float qui en fait ne sera jamais utilis.


Le ColorSpace c'est tout de mme pratique pour afficher/sauvegarder correctement une BufferedImage, ne serait-ce que pour dbuguer.  ::D:

----------


## ToTo13

> Le ColorSpace c'est tout de mme pratique pour afficher/sauvegarder correctement une BufferedImage, ne serait-ce que pour dbuguer.


Ben justement, me voil embt par les I/O.
J'ai cr des images avec des DataBufferInt (resp. DataBufferDouble) :


```

```


Seulement voil, maintenant j'aimerai lire/crire de telles images. JAI ne veut pas en entendre parler et ImageIO m'crit une image vide.

Une ide ?

----------


## ToTo13

J'ai oubli de prciser que FloatCS est un ColorSpace neutre :


```

```

----------


## pseudocode

> Seulement voil, maintenant j'aimerai lire/crire de telles images. JAI ne veut pas en entendre parler et ImageIO m'crit une image vide.
> 
> Une ide ?


J'ai test et il semble effectivement y avoir un problme si on utilise la totalit des 32 bits du DataBuffer.TYPE_INT.

Ca fonctionne si on spcifie explicitement le paramtre "int[] bits" dans ComponentColorModel, avec une valeur plus petite que 32. 
(quand on met "null", ca initialise au max possible pour le type --> 32)



```
new ComponentColorModel(myColorSpace, new int[] {31,31,31,...} ,false,false,ColorModel.OPAQUE,DataBuffer.TYPE_INT) ;
```

----------


## ToTo13

Merci, a fonctionne !
Mme en mettant 32, ImageJ et ImageIO sont tout  fait capable de lire les images sauvegardes.
ImageJ s'emmle juste un peu les pinceaux avec les types.

----------


## pseudocode

> Mme en mettant 32, ImageJ et ImageIO sont tout  fait capable de lire les images sauvegardes.


Ah? Perso, j'ai trouv la source du bug dans le JRE. 

fichier: ComponentColorModel.java 1.70 10/03/23
mthode: getNormalizedComponents()


```

```


Je ne sais pas si ca t corrig depuis.

----------


## ToTo13

> Ah? Perso, j'ai trouv la source du bug dans le JRE. 
> 
> fichier: ComponentColorModel.java 1.70 10/03/23
> mthode: getNormalizedComponents()
> 
> 
> ```
> 
> ```
> ...


Il semblerait car je viens de tester ce petit morceau de code :


```

```

J'ai mis des valeurs extrmes, cris puis lu l'image et tout s'est bien pass.

Encore merci...

----------

