[JAI-ImageIO] conversion d'espaces colorimétriques
Le
patriarch24
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(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)
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 !
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(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)
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 !

Poser une question


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).