Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[JAI-ImageIO] conversion d'espaces colorimétriques

2 réponses
Avatar
patriarch24
Bonjour =E0 tous,
je suis en train d'=E9crire des bouts de code effectuant des traitements
"basiques" sur des images, =E0 savoir conversion des formats d'entr=E9es
(jpeg, tiff, png / RGB, CMYK) vers un format unique pour traitement
(tiff / sRGB).
Pour cela, j'ai =E9crit ce petit bout de code pour la conversion
d'espaces colorim=E9triques :



private static ColorSpace loadRgbColorSpace() {
return ColorSpace.getInstance(ColorSpace.CS_sRGB);
}

private static ColorSpace loadCmykColorSpace() throws Exception {
ICC_Profile profileOutput =3D null;
try {
profileOutput =3D ICC_Profile.getInstance("C:/java/libs/JAI/
CMYK.pf");
} catch (IOException e) {
e.printStackTrace();
throw e;
}

return new ICC_ColorSpace(profileOutput);
}

private static void convertColorSpace(String fileName, String
colorSpace) throws Exception {
PlanarImage planarImage =3D JAI.create("fileload", fileName);
ColorModel colorModelInput =3D planarImage.getColorModel();
ColorSpace colorSpaceInput =3D colorModelInput.getColorSpace();

ColorSpace colorspaceOutput =3D null;
if("RGB".equals(colorSpace)) {
colorspaceOutput =3D loadRgbColorSpace();
} else if("CMYK".equals(colorSpace)) {
colorspaceOutput =3D loadCmykColorSpace();
}

System.out.println(colorSpaceInput.getNumComponents());
System.out.println(colorspaceOutput.getNumComponents());

PlanarImage planarImageProfile =3D convertColorSpace(planarImage,
colorSpaceInput, colorspaceOutput);

String newFilename =3D FilenameUtils.getFullPath(fileName)
+ FilenameUtils.getBaseName(fileName) + "_convertedtocmyk."
+ FilenameUtils.getExtension(fileName);

JAI.create("filestore", planarImageProfile, newFilename);
}

private static PlanarImage convertColorSpace(PlanarImage
planarImageInput,
ColorSpace colorSpaceInput, ColorSpace colorSpaceOutput) {

ColorModel colorModelInput =3D
RasterFactory.createComponentColorModel(
planarImageInput.getSampleModel().getDataType(),
colorSpaceInput, false, false, Transparency.OPAQUE);

ImageLayout imageLayoutInput =3D new ImageLayout();
imageLayoutInput.setColorModel(colorModelInput);
RenderingHints RenderingHintsInput =3D new RenderingHints(
JAI.KEY_IMAGE_LAYOUT, imageLayoutInput);
ParameterBlock parameterBlockInput =3D new ParameterBlock();
parameterBlockInput.addSource(planarImageInput);
parameterBlockInput
.add(planarImageInput.getSampleModel().getDataType());

PlanarImage planarInputImageInputWithProfile =3D JAI.create("format",
parameterBlockInput, RenderingHintsInput);

ColorModel colorModelOutput =3D RasterFactory
.createComponentColorModel(planarInputImageInputWithProfile
.getSampleModel().getDataType(), colorSpaceOutput,
false, false, Transparency.OPAQUE);

ImageLayout imageLayoutOutput =3D new ImageLayout();
imageLayoutOutput.setSampleModel(colorModelOutput
.createCompatibleSampleModel(planarInputImageInputWithProfile
.getWidth(), planarInputImageInputWithProfile
.getHeight()));
RenderingHints renderingHintsOutput =3D new RenderingHints(
JAI.KEY_IMAGE_LAYOUT, imageLayoutOutput);
ParameterBlock parameterBlockOutput =3D new ParameterBlock();
parameterBlockOutput.addSource(planarInputImageInputWithProfile);
parameterBlockOutput.add(colorModelOutput);

return JAI.create("ColorConvert", parameterBlockOutput,
renderingHintsOutput);
}

La conversion d'une image rgb ou niveau de gris vers cmyk fonctionne,
mais donne un r=E9sultat tr=E8s sombre. La conversion d'une image cmyk
vers rgb ne fonctionne pas pour la raison suivante :

Error: One factory fails for the operation "encode"
Occurs in: javax.media.jai.ThreadSafeOperationRegistry
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at javax.media.jai.FactoryCache.invoke(FactoryCache.java:130)
at
javax.media.jai.OperationRegistry.invokeFactory(OperationRegistry.java:
1682)
at
javax.media.jai.ThreadSafeOperationRegistry.invokeFactory(ThreadSafeOperatio=
nRegistry.java:
481)
at javax.media.jai.registry.RIFRegistry.create(RIFRegistry.java:340)
at com.sun.media.jai.opimage.FileStoreRIF.create(FileStoreRIF.java:
143)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at javax.media.jai.FactoryCache.invoke(FactoryCache.java:130)
at
javax.media.jai.OperationRegistry.invokeFactory(OperationRegistry.java:
1682)
at
javax.media.jai.ThreadSafeOperationRegistry.invokeFactory(ThreadSafeOperatio=
nRegistry.java:
481)
at javax.media.jai.registry.RIFRegistry.create(RIFRegistry.java:340)
at javax.media.jai.RenderedOp.createInstance(RenderedOp.java:830)
at javax.media.jai.RenderedOp.createRendering(RenderedOp.java:878)
at javax.media.jai.RenderedOp.getRendering(RenderedOp.java:899)
at javax.media.jai.JAI.createNS(JAI.java:1103)
at javax.media.jai.JAI.create(JAI.java:977)
at javax.media.jai.JAI.create(JAI.java:1584)
at fr.cgin.tests.imaging.Main.convertColorSpace(Main.java:187)
at fr.cgin.tests.imaging.Main.main(Main.java:127)
Caused by: java.lang.IllegalArgumentException: Numbers of source
Raster bands and source color space components do not match
at java.awt.image.ColorConvertOp.filter(Unknown Source)
at
com.sun.media.jai.opimage.ColorConvertOpImage.computeRectNonColorSpaceJAI(Co=
lorConvertOpImage.java:
369)
at
com.sun.media.jai.opimage.ColorConvertOpImage.computeRect(ColorConvertOpImag=
e.java:
289)
at javax.media.jai.PointOpImage.computeTile(PointOpImage.java:977)
at
com.sun.media.jai.util.SunTileScheduler.scheduleTile(SunTileScheduler.java:
912)
at javax.media.jai.OpImage.getTile(OpImage.java:1139)
at javax.media.jai.PlanarImage.cobbleByte(PlanarImage.java:2863)
at javax.media.jai.PlanarImage.getData(PlanarImage.java:2182)
at
com.sun.media.jai.codecimpl.TIFFImageEncoder.encode(TIFFImageEncoder.java:
1021)
at
com.sun.media.jai.codecimpl.TIFFImageEncoder.encode(TIFFImageEncoder.java:
161)
at com.sun.media.jai.opimage.EncodeRIF.create(EncodeRIF.java:79)
=2E.. 25 more
J'ai pass=E9 la plupart de la pile d'appel en ne laissant que le
principal.
Maintenant j'ai deux questions :
- comment rem=E9dier au probl=E8me des "images sombres" ?
- comment rem=E9dier au probl=E8me dont la trace est ci-dessus ?

Merci d'avance !

2 réponses

Avatar
TestMan
patriarch24 wrote:
Bonjour à tous,
je suis en train d'écrire des bouts de code effectuant des traitements
"basiques" sur des images, à savoir conversion des formats d'entrées
(jpeg, tiff, png / RGB, CMYK) vers un format unique pour traitement
(tiff / sRGB).
Pour cela, j'ai écrit ce petit bout de code pour la conversion
d'espaces colorimétriques :



private static ColorSpace loadRgbColorSpace() {
return ColorSpace.getInstance(ColorSpace.CS_sRGB);
}

private static ColorSpace loadCmykColorSpace() throws Exception {
ICC_Profile profileOutput = null;
try {
profileOutput = ICC_Profile.getInstance("C:/java/libs/JAI/
CMYK.pf");
} catch (IOException e) {
e.printStackTrace();
throw e;
}

return new ICC_ColorSpace(profileOutput);
}

private static void convertColorSpace(String fileName, String
colorSpace) throws Exception {
PlanarImage planarImage = JAI.create("fileload", fileName);
ColorModel colorModelInput = planarImage.getColorModel();
ColorSpace colorSpaceInput = colorModelInput.getColorSpace();

ColorSpace colorspaceOutput = null;
if("RGB".equals(colorSpace)) {
colorspaceOutput = loadRgbColorSpace();
} else if("CMYK".equals(colorSpace)) {
colorspaceOutput = loadCmykColorSpace();
}

System.out.println(colorSpaceInput.getNumComponents());
System.out.println(colorspaceOutput.getNumComponents());

PlanarImage planarImageProfile = convertColorSpace(planarImage,
colorSpaceInput, colorspaceOutput);

String newFilename = FilenameUtils.getFullPath(fileName)
+ FilenameUtils.getBaseName(fileName) + "_convertedtocmyk."
+ FilenameUtils.getExtension(fileName);

JAI.create("filestore", planarImageProfile, newFilename);
}

private static PlanarImage convertColorSpace(PlanarImage
planarImageInput,
ColorSpace colorSpaceInput, ColorSpace colorSpaceOutput) {

ColorModel colorModelInput > RasterFactory.createComponentColorModel(
planarImageInput.getSampleModel().getDataType(),
colorSpaceInput, false, false, Transparency.OPAQUE);

ImageLayout imageLayoutInput = new ImageLayout();
imageLayoutInput.setColorModel(colorModelInput);
RenderingHints RenderingHintsInput = new RenderingHints(
JAI.KEY_IMAGE_LAYOUT, imageLayoutInput);
ParameterBlock parameterBlockInput = new ParameterBlock();
parameterBlockInput.addSource(planarImageInput);
parameterBlockInput
.add(planarImageInput.getSampleModel().getDataType());

PlanarImage planarInputImageInputWithProfile = JAI.create("format",
parameterBlockInput, RenderingHintsInput);

ColorModel colorModelOutput = RasterFactory
.createComponentColorModel(planarInputImageInputWithProfile
.getSampleModel().getDataType(), colorSpaceOutput,
false, false, Transparency.OPAQUE);

ImageLayout imageLayoutOutput = new ImageLayout();
imageLayoutOutput.setSampleModel(colorModelOutput
.createCompatibleSampleModel(planarInputImageInputWithProfile
.getWidth(), planarInputImageInputWithProfile
.getHeight()));
RenderingHints renderingHintsOutput = new RenderingHints(
JAI.KEY_IMAGE_LAYOUT, imageLayoutOutput);
ParameterBlock parameterBlockOutput = new ParameterBlock();
parameterBlockOutput.addSource(planarInputImageInputWithProfile);
parameterBlockOutput.add(colorModelOutput);

return JAI.create("ColorConvert", parameterBlockOutput,
renderingHintsOutput);
}

La conversion d'une image rgb ou niveau de gris vers cmyk fonctionne,
mais donne un résultat très sombre. La conversion d'une image cmyk
vers rgb ne fonctionne pas pour la raison suivante :

Error: One factory fails for the operation "encode"
Occurs in: javax.media.jai.ThreadSafeOperationRegistry
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at javax.media.jai.FactoryCache.invoke(FactoryCache.java:130)
at
javax.media.jai.OperationRegistry.invokeFactory(OperationRegistry.java:
1682)
at
javax.media.jai.ThreadSafeOperationRegistry.invokeFactory(ThreadSafeOperationRegistry.java:
481)
at javax.media.jai.registry.RIFRegistry.create(RIFRegistry.java:340)
at com.sun.media.jai.opimage.FileStoreRIF.create(FileStoreRIF.java:
143)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at javax.media.jai.FactoryCache.invoke(FactoryCache.java:130)
at
javax.media.jai.OperationRegistry.invokeFactory(OperationRegistry.java:
1682)
at
javax.media.jai.ThreadSafeOperationRegistry.invokeFactory(ThreadSafeOperationRegistry.java:
481)
at javax.media.jai.registry.RIFRegistry.create(RIFRegistry.java:340)
at javax.media.jai.RenderedOp.createInstance(RenderedOp.java:830)
at javax.media.jai.RenderedOp.createRendering(RenderedOp.java:878)
at javax.media.jai.RenderedOp.getRendering(RenderedOp.java:899)
at javax.media.jai.JAI.createNS(JAI.java:1103)
at javax.media.jai.JAI.create(JAI.java:977)
at javax.media.jai.JAI.create(JAI.java:1584)
at fr.cgin.tests.imaging.Main.convertColorSpace(Main.java:187)
at fr.cgin.tests.imaging.Main.main(Main.java:127)
Caused by: java.lang.IllegalArgumentException: Numbers of source
Raster bands and source color space components do not match
at java.awt.image.ColorConvertOp.filter(Unknown Source)
at
com.sun.media.jai.opimage.ColorConvertOpImage.computeRectNonColorSpaceJAI(ColorConvertOpImage.java:
369)
at
com.sun.media.jai.opimage.ColorConvertOpImage.computeRect(ColorConvertOpImage.java:
289)
at javax.media.jai.PointOpImage.computeTile(PointOpImage.java:977)
at
com.sun.media.jai.util.SunTileScheduler.scheduleTile(SunTileScheduler.java:
912)
at javax.media.jai.OpImage.getTile(OpImage.java:1139)
at javax.media.jai.PlanarImage.cobbleByte(PlanarImage.java:2863)
at javax.media.jai.PlanarImage.getData(PlanarImage.java:2182)
at
com.sun.media.jai.codecimpl.TIFFImageEncoder.encode(TIFFImageEncoder.java:
1021)
at
com.sun.media.jai.codecimpl.TIFFImageEncoder.encode(TIFFImageEncoder.java:
161)
at com.sun.media.jai.opimage.EncodeRIF.create(EncodeRIF.java:79)
... 25 more
J'ai passé la plupart de la pile d'appel en ne laissant que le
principal.
Maintenant j'ai deux questions :
- comment remédier au problème des "images sombres" ?
- comment remédier au problème dont la trace est ci-dessus ?

Merci d'avance !



Bonjour,

Comment testez-vous que "les images sont sombre" ?
Photoshop ? Impresion ? profil de votre moniteur ? calibré ?

Concernant l'exception, vérifiez que l'ensemble des profils manipulés
sont disponible dans le chemin par défaut ... "on sait jamais".

A+
TM
Avatar
patriarch24
On 26 juin, 10:36, TestMan wrote:
patriarch24 wrote:
> Bonjour à tous,
> je suis en train d'écrire des bouts de code effectuant des traitement s
> "basiques" sur des images, à savoir conversion des formats d'entrée s
> (jpeg, tiff, png / RGB, CMYK) vers un format unique pour traitement
> (tiff / sRGB).
> Pour cela, j'ai écrit ce petit bout de code pour la conversion
> d'espaces colorimétriques :

>    private static ColorSpace loadRgbColorSpace() {
>            return ColorSpace.getInstance(ColorSpace.CS_sRGB );
>    }

>    private static ColorSpace loadCmykColorSpace() throws Exception {
>            ICC_Profile profileOutput = null;
>            try {
>                    profileOutput = ICC_Profile.ge tInstance("C:/java/libs/JAI/
> CMYK.pf");
>            } catch (IOException e) {
>                    e.printStackTrace();
>                    throw e;
>            }

>            return new ICC_ColorSpace(profileOutput);
>    }

>    private static void convertColorSpace(String fileName, String
> colorSpace) throws Exception {
>            PlanarImage planarImage = JAI.create("fileload ", fileName);
>            ColorModel colorModelInput = planarImage.getCo lorModel();
>            ColorSpace colorSpaceInput = colorModelInput.g etColorSpace();

>            ColorSpace colorspaceOutput = null;
>            if("RGB".equals(colorSpace)) {
>                    colorspaceOutput = loadRgbColo rSpace();
>            } else if("CMYK".equals(colorSpace)) {
>                    colorspaceOutput = loadCmykCol orSpace();
>            }

>            System.out.println(colorSpaceInput.getNumCompone nts());
>            System.out.println(colorspaceOutput.getNumCompon ents());

>            PlanarImage planarImageProfile = convertColorS pace(planarImage,
>                            colorSpaceInput, colorspaceOutput);

>            String newFilename = FilenameUtils.getFullPath (fileName)
>                            + FilenameUtils. getBaseName(fileName) + "_convertedtocmyk."
>                            + FilenameUtils. getExtension(fileName);

>            JAI.create("filestore", planarImageProfile, newF ilename);
>    }

>    private static PlanarImage convertColorSpace(PlanarImage
> planarImageInput,
>                    ColorSpace colorSpaceInput, Colo rSpace colorSpaceOutput) {

>            ColorModel colorModelInput =
> RasterFactory.createComponentColorModel(
>                            planarImageInput .getSampleModel().getDataType(),
>                            colorSpaceInput, false, false, Transparency.OPAQUE);

>            ImageLayout imageLayoutInput = new ImageLayout ();
>            imageLayoutInput.setColorModel(colorModelInput);
>            RenderingHints RenderingHintsInput = new Rende ringHints(
>                            JAI.KEY_IMAGE_LA YOUT, imageLayoutInput);
>            ParameterBlock parameterBlockInput = new Param eterBlock();
>            parameterBlockInput.addSource(planarImageInput);
>            parameterBlockInput
>                            .add(planarImage Input.getSampleModel().getDataType());

>            PlanarImage planarInputImageInputWithProfile = JAI.create("format",
>                            parameterBlockIn put, RenderingHintsInput);

>            ColorModel colorModelOutput = RasterFactory
>                            .createComponent ColorModel(planarInputImageInputWithProfile
>                                            .getSampleModel().getDataType(), colorSpaceOutput,
>                                            false, false, Transparency.OPAQUE);

>            ImageLayout imageLayoutOutput = new ImageLayou t();
>            imageLayoutOutput.setSampleModel(colorModelOutpu t
>                            .createCompatibl eSampleModel(planarInputImageInputWithProfile
>                                            .getWidth(), planarInputImageInputWithProfile
>                                            .getHeight()));
>            RenderingHints renderingHintsOutput = new Rend eringHints(
>                            JAI.KEY_IMAGE_LA YOUT, imageLayoutOutput);
>            ParameterBlock parameterBlockOutput = new Para meterBlock();
>            parameterBlockOutput.addSource(planarInputImageI nputWithProfile);
>            parameterBlockOutput.add(colorModelOutput);

>            return JAI.create("ColorConvert", parameterBlock Output,
>                            renderingHintsOu tput);
>    }

> La conversion d'une image rgb ou niveau de gris vers cmyk fonctionne,
> mais donne un résultat très sombre. La conversion d'une image cmyk
> vers rgb ne fonctionne pas pour la raison suivante :

> Error: One factory fails for the operation "encode"
> Occurs in: javax.media.jai.ThreadSafeOperationRegistry
> java.lang.reflect.InvocationTargetException
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
> at java.lang.reflect.Method.invoke(Unknown Source)
> at javax.media.jai.FactoryCache.invoke(FactoryCache.java:130)
> at
> javax.media.jai.OperationRegistry.invokeFactory(OperationRegistry.java:
> 1682)
> at
> javax.media.jai.ThreadSafeOperationRegistry.invokeFactory(ThreadSafeOpe rationRegistry.java:
> 481)
> at javax.media.jai.registry.RIFRegistry.create(RIFRegistry.java:340)
> at com.sun.media.jai.opimage.FileStoreRIF.create(FileStoreRIF.java:
> 143)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
> at java.lang.reflect.Method.invoke(Unknown Source)
> at javax.media.jai.FactoryCache.invoke(FactoryCache.java:130)
> at
> javax.media.jai.OperationRegistry.invokeFactory(OperationRegistry.java:
> 1682)
> at
> javax.media.jai.ThreadSafeOperationRegistry.invokeFactory(ThreadSafeOpe rationRegistry.java:
> 481)
> at javax.media.jai.registry.RIFRegistry.create(RIFRegistry.java:340)
> at javax.media.jai.RenderedOp.createInstance(RenderedOp.java:830)
> at javax.media.jai.RenderedOp.createRendering(RenderedOp.java:878)
> at javax.media.jai.RenderedOp.getRendering(RenderedOp.java:899)
> at javax.media.jai.JAI.createNS(JAI.java:1103)
> at javax.media.jai.JAI.create(JAI.java:977)
> at javax.media.jai.JAI.create(JAI.java:1584)
> at fr.cgin.tests.imaging.Main.convertColorSpace(Main.java:187)
> at fr.cgin.tests.imaging.Main.main(Main.java:127)
> Caused by: java.lang.IllegalArgumentException: Numbers of source
> Raster bands and source color space components do not match
> at java.awt.image.ColorConvertOp.filter(Unknown Source)
> at
> com.sun.media.jai.opimage.ColorConvertOpImage.computeRectNonColorSpaceJ AI(ColorConvertOpImage.java:
> 369)
> at
> com.sun.media.jai.opimage.ColorConvertOpImage.computeRect(ColorConvertO pImage.java:
> 289)
> at javax.media.jai.PointOpImage.computeTile(PointOpImage.java:977)
> at
> com.sun.media.jai.util.SunTileScheduler.scheduleTile(SunTileScheduler.j ava:
> 912)
> at javax.media.jai.OpImage.getTile(OpImage.java:1139)
> at javax.media.jai.PlanarImage.cobbleByte(PlanarImage.java:2863)
> at javax.media.jai.PlanarImage.getData(PlanarImage.java:2182)
> at
> com.sun.media.jai.codecimpl.TIFFImageEncoder.encode(TIFFImageEncoder.ja va:
> 1021)
> at
> com.sun.media.jai.codecimpl.TIFFImageEncoder.encode(TIFFImageEncoder.ja va:
> 161)
> at com.sun.media.jai.opimage.EncodeRIF.create(EncodeRIF.java:79)
> ... 25 more
> J'ai passé la plupart de la pile d'appel en ne laissant que le
> principal.
> Maintenant j'ai deux questions :
> - comment remédier au problème des "images sombres" ?
> - comment remédier au problème dont la trace est ci-dessus ?

> Merci d'avance !

Bonjour,

Comment testez-vous que "les images sont sombre" ?
Photoshop ? Impresion ? profil de votre moniteur ? calibré ?

Concernant l'exception, vérifiez que l'ensemble des profils manipulés
sont disponible dans le chemin par défaut ... "on sait jamais".

A+
TM



En visionnant les images, ou en les imprimant, elles sont clairement
plus sombres (lol).