private RenderedImage forceComponentColorModel(RenderedImage image) { final IndexColorModel icm = (IndexColorModel) image.getColorModel(); final SampleModel sm = image.getSampleModel(); final int datatype = sm.getDataType(); final boolean alpha = icm.hasAlpha(); // Definition of the lookup table final int numDestinationBands = 4; LookupTableJAI lut = null; final byte data[][] = new byte[numDestinationBands][icm.getMapSize()]; icm.getReds(data[0]); icm.getGreens(data[1]); icm.getBlues(data[2]); icm.getAlphas(data[3]); lut = new LookupTableJAI(data); // Layout creation final ImageLayout layout = new ImageLayout(image); final RenderingHints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout); int[] bits = new int[numDestinationBands]; // bits per component for (int i = 0; i < numDestinationBands; i++) bits[i] = sm.getSampleSize(i); final ComponentColorModel destinationColorModel = new ComponentColorModel( ColorSpace.getInstance(ColorSpace.CS_sRGB), bits, alpha, image.getColorModel().isAlphaPremultiplied(), alpha ? Transparency.TRANSLUCENT : Transparency.OPAQUE, datatype); final SampleModel destinationSampleModel = destinationColorModel.createCompatibleSampleModel(image.getWidth(), image.getHeight()); layout.setColorModel(destinationColorModel); layout.setSampleModel(destinationSampleModel); // Lookup Operations image = LookupDescriptor.create(image, new LookupTableWrapper(lut), 0, null, null, false, hints); return image; }
protected RenderedImage convert(RenderedImage renderedImage) throws Exception { int height = renderedImage.getHeight(); int width = renderedImage.getWidth(); SampleModel sampleModel = renderedImage.getSampleModel(); ColorModel colorModel = renderedImage.getColorModel(); Raster raster = renderedImage.getData(); DataBuffer dataBuffer = raster.getDataBuffer(); if (colorModel instanceof IndexColorModel) { IndexColorModel indexColorModel = (IndexColorModel) colorModel; int mapSize = indexColorModel.getMapSize(); byte[][] data = new byte[4][mapSize]; indexColorModel.getReds(data[0]); indexColorModel.getGreens(data[1]); indexColorModel.getBlues(data[2]); indexColorModel.getAlphas(data[3]); LookupTableJAI lookupTableJAI = new LookupTableJAI(data); renderedImage = LookupDescriptor.create(renderedImage, lookupTableJAI, null); } else if (sampleModel.getNumBands() == 2) { List<Byte> bytesList = new ArrayList<Byte>(height * width * _NUM_OF_BANDS); List<Byte> tempBytesList = new ArrayList<Byte>(_NUM_OF_BANDS); for (int i = 0; i < dataBuffer.getSize(); i++) { int mod = (i + 1) % 2; int elemPos = i; if (mod == 0) { tempBytesList.add((byte) dataBuffer.getElem(elemPos - 1)); tempBytesList.add((byte) dataBuffer.getElem(elemPos - 1)); } tempBytesList.add((byte) dataBuffer.getElem(elemPos)); if (mod == 0) { Collections.reverse(tempBytesList); bytesList.addAll(tempBytesList); tempBytesList.clear(); } } byte[] data = ArrayUtil.toArray(bytesList.toArray(new Byte[bytesList.size()])); DataBuffer newDataBuffer = new DataBufferByte(data, data.length); renderedImage = createRenderedImage(renderedImage, height, width, newDataBuffer); } else if (colorModel.getTransparency() != Transparency.TRANSLUCENT) { List<Byte> bytesList = new ArrayList<Byte>(height * width * _NUM_OF_BANDS); List<Byte> tempBytesList = new ArrayList<Byte>(_NUM_OF_BANDS); for (int i = 0; i < dataBuffer.getSize(); i++) { int mod = (i + 1) % 3; int elemPos = i; tempBytesList.add((byte) dataBuffer.getElem(elemPos)); if (mod == 0) { tempBytesList.add((byte) 255); Collections.reverse(tempBytesList); bytesList.addAll(tempBytesList); tempBytesList.clear(); } } byte[] data = ArrayUtil.toArray(bytesList.toArray(new Byte[bytesList.size()])); DataBuffer newDataBuffer = new DataBufferByte(data, data.length); renderedImage = createRenderedImage(renderedImage, height, width, newDataBuffer); } return renderedImage; }