From: Martin D. <mar...@no...> - 2006-06-29 14:16:34
|
Simone Giannecchini a =E9crit : > is there anyway me (or anyone else like aaime) can help you out with > the merge. [...snip...] >=20 > Plz, let me know how I can be of help, I am sure others will follow... Thanks for your offer. I'm still porting ImageUtilities. Not yet finished= , but I made some progress.=20 Commited latest bunch of work as of revision 20230. I'm working only on module/coverage. I would let the merge of other modul= es (including module/main)=20 to other peoples if possible. Once the merge is finished, I would suggest= to work directly on trunk,=20 especially if future work are mostly bug fixes, unless there is other maj= or work undergoing. All new methods in ImageUtilities were moved in org.geotools.image.ImageW= orker (a new class). I have=20 not yet finished it. But if you want, you could copy ImageWorker from tru= nk to the coverage branch=20 and start changing the references to ImageUtilities to ImageWorker in the= code. And of course test,=20 test and test, since I made my best but have probably done some mistakes = there and there. Note: I=20 have added a convenience method for testing. More detais below. Differences between ImageWorker and ImageUtilities: --------------------------------------------------- * Instead of a bunch of static methods, we create one ImageWorker inst= ance with the image we want to work on. From this point, we control various methods like "f= orceIndexColorModel()" for applying operations on the image. Advantages are: - We have more control on the operation process (including tile cach= e control) through ImageWorker.setRenderingHint(...). So we can control the whole set= of rendering hints, compared to a few boolean parameters in the static methods. - The static methods were expecting and returning a mix of PlanarIma= ge or RenderedOp objects. ImageWorker allow to access to the image result through g= etRenderedImage(), getPlanarImage() or getRenderedOperation(), at user choice. For us= ers who just want a RenderedImage, the above choice allows them to get that image wi= thout creating an unecessary "Null" operation. * The static methods had a some duplicated code, which I tried to redu= ce. Some methods also had hard-coded values (e.g. addTransparency2IndexColorModel), w= hich I tried to avoid as well. * Sometime the algorithm has been significatively changed. For example ImageUtilities.addTransparency2IndexColorModel(...) tries to set the= transparent pixel value using the "Add" operation, while I believe that the intend was= a combinaison of "And" and "Or" operations. I reimplemented this method using such "A= nd" / "Or", and took the occasion to factor out a part of the code as a new "mask" m= ethod. Testing ------------------------------------------------- I have not yet tested all methods, but I tested some of them. Try the fol= lowing from the command line: java org.geotools.image.ImageWorker PP20000102.png -operation binari= ze Where PP20000102.png should be some image on yours disk. This main method= actually do nothing more=20 than loading the image, applying the specified operation and invoking the= following method: imageWorker.show(); The 'show()' method will display a widget with a buch of informations for= browsing the operation=20 chain. This is a kind of "toString()" method for debugging purpose, but m= uch more elaborated. Note:=20 Use a raisonable image size - this widget is for debugging the operation = chain, not for testing its=20 capacity to render large images. Note: ImageWorker.show() requires "gt2-widgets-swing.jar" to be in the cl= asspath. For all other=20 methods, this dependency is of course not needed. Javadoc: ------------------------------------------------- http://javadoc.geotools.fr/snapshot/org/geotools/image/ImageWorker.html Mapping from ImageUtilities to ImageWorker (I admit that using ImageWorker is more verbove): ------------------------------------------------- Old: image =3D ImageUtilities.rescale2Byte(image); Proposed replacement: ImageWorker worker =3D new ImageWorker(image); worker.rescaleToBytes(); image =3D worker.getPlanarImage(); ------------------------------------------------------------- Old: image =3D ImageUtilities.RGBIndexColorModel(image); Proposed replacement: ImageWorker worker =3D new ImageWorker(image); worker.forceIndexColorModel(); image =3D worker.getPlanarImage(); ------------------------------------------------------------- Old: image =3D ImageUtilities.direct2ComponentColorModel(image); image =3D ImageUtilities.reformatColorModel2ComponentColorModel(imag= e); Proposed replacement: ImageWorker worker =3D new ImageWorker(image); worker.forceComponentColorModel(); image =3D worker.getPlanarImage(); ------------------------------------------------------------- Old: image =3D ImageUtilities.binarizeImageExt(image, threshold, cacheMe)= ; Proposed replacement: ImageWorker worker =3D new ImageWorker(image); if (!cacheMe) { worker.setRenderingHint(JAI.KEY_TILE_CACHE, null); } worker.binarize(threshold); image =3D worker.getRenderedOperation(); ------------------------------------------------------------- Old: image =3D ImageUtilities.roiExt(image, threshold, cacheMe); Proposed replacement: ImageWorker worker =3D new ImageWorker(image); if (!cacheMe) { worker.setRenderingHint(JAI.KEY_TILE_CACHE, null); } worker.binarize(threshold); image =3D worker.getImageAsROI(); ------------------------------------------------------------- Old: image =3D ImageUtilities.bandCombineSimple(image, cacheMe); image =3D ImageUtilities.convertIHS(image, cacheMe); Proposed replacement: ImageWorker worker =3D new ImageWorker(image); if (!cacheMe) { worker.setRenderingHint(JAI.KEY_TILE_CACHE, null); } worker.intensity(); image =3D worker.getRenderedOperation(); ------------------------------------------------------------- Old: image =3D ImageUtilities.selectBand(image, threshold, cacheMe); Proposed replacement: ImageWorker worker =3D new ImageWorker(image); if (!cacheMe) { worker.setRenderingHint(JAI.KEY_TILE_CACHE, null); } worker.retainFirstBand(threshold); image =3D worker.getRenderedOperation(); ------------------------------------------------------------- Old: image =3D ImageUtilities.addTransparency2IndexColorModel(image, alph= a, optimizeForGIF); Proposed replacement: ImageWorker worker =3D new ImageWorker(image); if (optimizeForGIF) { worker.setRenderingHint(ImageWorker.TILING_ALLOWED, Boolean.FALS= E); } worker.addTransparencyToIndexColorModel(threshold); image =3D worker.getRenderedOperation(); |