/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2006-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.image.palette; import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.awt.image.IndexColorModel; import java.awt.image.RenderedImage; import javax.media.jai.ImageLayout; import javax.media.jai.JAI; import javax.media.jai.OperationDescriptor; import javax.media.jai.ParameterBlockJAI; import javax.media.jai.PlanarImage; import junit.framework.TestCase; import org.geotools.image.ImageWorker; import org.junit.Test; /** * Testing custom code for color reduction. * * @author Simone Giannecchini, GeoSolutions SAS * * * @source $URL: http://svn.osgeo.org/geotools/trunk/modules/library/coverage/src/test/java/org/geotools/image/palette/CustomPaletteBuilderTest.java $ */ public class CustomPaletteBuilderTest extends TestCase { @Test public void testOneColorBug() { // build a transparent image BufferedImage image = new BufferedImage(256, 256, BufferedImage.TYPE_4BYTE_ABGR); // create a palette out of it CustomPaletteBuilder builder = new CustomPaletteBuilder(image, 256, 1,1, 1); builder.buildPalette(); RenderedImage indexed = builder.getIndexedImage(); assertTrue(indexed.getColorModel() instanceof IndexColorModel); IndexColorModel icm = (IndexColorModel) indexed.getColorModel(); // png encoder go mad if they get a one element palette, we need at least two assertEquals(2, icm.getMapSize()); } @Test public void testGrayColor() { BufferedImage image = new BufferedImage(256, 256, BufferedImage.TYPE_BYTE_GRAY); Graphics g = image.getGraphics(); g.setColor(Color.WHITE); g.fillRect(0, 0, 20, 20); g.setColor(new Color(20, 20, 20)); // A dark gray g.fillRect(20, 20, 20, 20); g.setColor(new Color(200, 200, 200)); // A light gray g.fillRect(0, 20, 20, 20); g.dispose(); CustomPaletteBuilder builder = new CustomPaletteBuilder(image, 256, 1, 1, 1); RenderedImage indexed = builder.buildPalette().getIndexedImage(); assertTrue(indexed.getColorModel() instanceof IndexColorModel); IndexColorModel icm = (IndexColorModel) indexed.getColorModel(); assertEquals(4, icm.getMapSize()); //Black background, white fill, light gray fill, dark gray fill = 4 colors } @Test public void testFourColor() { // build a transparent image BufferedImage image = new BufferedImage(256, 256, BufferedImage.TYPE_4BYTE_ABGR); Graphics g = image.getGraphics(); g.setColor(Color.WHITE); g.fillRect(0, 0, 10, 10); g.setColor(Color.RED); g.fillRect(10, 0, 10, 10); g.setColor(Color.BLUE); g.fillRect(20, 0, 10, 10); g.setColor(Color.GREEN); g.fillRect(30, 0, 10, 10); g.dispose(); // // create a palette out of it // CustomPaletteBuilder builder = new CustomPaletteBuilder(image, 255, 1, 1, 1); builder.buildPalette(); RenderedImage indexed = builder.getIndexedImage(); assertTrue(indexed.getColorModel() instanceof IndexColorModel); IndexColorModel icm = (IndexColorModel) indexed.getColorModel(); // make sure we have 4 colors + transparent one assertEquals(5, icm.getMapSize()); // // now use the JAI op // assertNotNull((OperationDescriptor) JAI.getDefaultInstance().getOperationRegistry(). getDescriptor(OperationDescriptor.class, "org.geotools.ColorReduction")); ParameterBlockJAI pbj = new ParameterBlockJAI("org.geotools.ColorReduction"); // I will tile the image in 4 tiles and force parallelism here JAI.getDefaultInstance().getTileScheduler().setParallelism(4); pbj.addSource( new ImageWorker(image). setRenderingHint(JAI.KEY_IMAGE_LAYOUT, new ImageLayout(image).setTileGridXOffset(0).setTileGridYOffset(0).setTileHeight(64).setTileWidth(64) ).tile().getRenderedImage() ); pbj.setParameter( "numColors", 255); pbj.setParameter("alphaThreshold", 1); pbj.setParameter("subsampleX", 1); pbj.setParameter("subsampleY", 1); indexed = JAI.create("org.geotools.ColorReduction", pbj); PlanarImage.wrapRenderedImage(indexed).getTiles(); assertTrue(indexed.getColorModel() instanceof IndexColorModel); // check that we get the same results assertEquals(indexed.getColorModel(), icm); icm = (IndexColorModel) indexed.getColorModel(); // make sure we have 4 colors + transparent one assertEquals(5, icm.getMapSize()); assertEquals(5, icm.getMapSize()); // // now use the inversion of color // assertNotNull((OperationDescriptor) JAI.getDefaultInstance().getOperationRegistry(). getDescriptor(OperationDescriptor.class, "org.geotools.ColorInversion")); pbj = new ParameterBlockJAI("org.geotools.ColorInversion"); pbj.addSource( new ImageWorker(image). setRenderingHint(JAI.KEY_IMAGE_LAYOUT, new ImageLayout(image).setTileGridXOffset(0).setTileGridYOffset(0).setTileHeight(64).setTileWidth(64) ).tile().getRenderedImage() ); pbj.setParameter("quantizationColors", InverseColorMapRasterOp.DEFAULT_QUANTIZATION_COLORS); pbj.setParameter("alphaThreshold", 1); pbj.setParameter("IndexColorModel", icm); indexed = JAI.create("org.geotools.ColorInversion", pbj); PlanarImage.wrapRenderedImage(indexed).getTiles(); assertTrue(indexed.getColorModel() instanceof IndexColorModel); // check that we get the same results assertEquals(indexed.getColorModel(), icm); icm = (IndexColorModel) indexed.getColorModel(); // make sure we have 4 colors + transparent one assertEquals(5, icm.getMapSize()); assertEquals(5, icm.getMapSize()); } }