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 :
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 :
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 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); }
J'ai passé la plupart de la pile d'appel en ne laissant que le principal.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
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 !
Partager