@Override RenderedImage process( ImageWorker inputWorker, Hints hints, Map<String, Expression> parameters) { // // IT WORKS ONLY ON BYTE DATA TYPE!!! // // convert the input image to 8 bit inputWorker.rescaleToBytes(); // compute the histogram final Histogram h = inputWorker.removeRenderingHints().getHistogram(null, null, null); // do the actual lookup Map<String, Object> params = new HashMap<String, Object>(); params.put(KEY_HISTOGRAM, h); LookupTable table = createByteLookupTable(params); inputWorker.setRenderingHints(hints); inputWorker.lookup(table); return inputWorker.getRenderedImage(); }
@Override RenderedImage process( ImageWorker inputWorker, Hints hints, Map<String, Expression> parameters) { checkParameters(parameters, KEY_MIN, KEY_MAX); Map<String, Object> processParams = getMinMaxParams(parameters); RenderedImage inputImage = inputWorker.getRenderedImage(); final int dataType = inputImage.getSampleModel().getDataType(); Utilities.ensureNonNull("processParams", processParams); double minData = (double) processParams.get(KEY_MIN); double maxData = (double) processParams.get(KEY_MAX); if (dataType == DataBuffer.TYPE_BYTE) { // Optimization for byte images, we use the lookup operation if (maxData == MAX_BYTE && minData == MIN_BYTE) return inputImage; LookupTable table = createByteLookupTable(processParams); inputWorker.setRenderingHints(hints); inputWorker.lookup(table); return inputWorker.getRenderedImage(); } // // STEP 2 use generic piecewise // processParams.put(KEY_DATATYPE, dataType); final PiecewiseTransform1D<DefaultPiecewiseTransform1DElement> transform = generatePiecewise(processParams); inputWorker.piecewise(transform, Integer.valueOf(0)); return inputWorker.getRenderedImage(); }
case DataBuffer.TYPE_USHORT: inputRI = worker.lookup( createLookupTableUShort( exclusionLuminanceRanges, dataType)) imagesStack.push(worker.getRenderedImage()); inputRI = worker.lookup(createLookupTableByte(exclusionLuminanceRanges, dataType)) .getRenderedImage(); break; imagesStack.push(worker.getRenderedImage()); inputRI = worker.lookup(createLookupTableByte(exclusionLuminanceRanges, dataType)) .getRenderedImage(); break; } else { inputRI = worker.lookup(createLookupTableByte(exclusionLuminanceRanges, dataType)) .getRenderedImage();
@Override RenderedImage process( ImageWorker inputWorker, Hints hints, Map<String, Expression> parameters) { checkParameters(parameters, KEY_MIN, KEY_MAX); Map<String, Object> processParams = getMinMaxParams(parameters); RenderedImage inputImage = inputWorker.getRenderedImage(); final int dataType = inputImage.getSampleModel().getDataType(); Utilities.ensureNonNull("processParams", processParams); double minData = (double) processParams.get(KEY_MIN); double maxData = (double) processParams.get(KEY_MAX); if (dataType == DataBuffer.TYPE_BYTE) { if (maxData == MAX_BYTE && minData == MIN_BYTE) { return inputImage; } // Optimization for byte images, we use the lookup operation LookupTable table = createByteLookupTable(processParams); inputWorker.setRenderingHints(hints); inputWorker.lookup(table); return inputWorker.getRenderedImage(); } // // STEP 2 use generic piecewise // final PiecewiseTransform1D<DefaultPiecewiseTransform1DElement> transform = generatePiecewise(processParams); inputWorker.piecewise(transform, Integer.valueOf(0)); return inputWorker.getRenderedImage(); }
worker.lookup(table); } else {
inputWorker.lookup(table); return inputWorker.getRenderedImage();
@Override RenderedImage process( ImageWorker inputWorker, Hints hints, Map<String, Expression> parameters) { RenderedImage inputImage = inputWorker.getRenderedImage(); assert inputImage.getSampleModel().getNumBands() == 1 : inputImage; final int dataType = inputImage.getSampleModel().getDataType(); if (dataType == DataBuffer.TYPE_BYTE) { // // Optimisation for byte images // LookupTable table = createByteLookupTable(EMPTY_MAP); inputWorker.lookup(table); return inputWorker.getRenderedImage(); } // General case, we use the piecewise1D transform // // STEP 1 do the extrema // inputWorker.removeRenderingHints(); final double[] minimum = inputWorker.getMinimums(); final double[] maximum = inputWorker.getMaximums(); // // STEP 2 use generic piecewise // final PiecewiseTransform1D<DefaultPiecewiseTransform1DElement> transform = generatePiecewise(setMinMaxParams(minimum[0], maximum[0])); inputWorker.piecewise(transform, Integer.valueOf(0)); return inputWorker.getRenderedImage(); }
@Override RenderedImage process( ImageWorker inputWorker, Hints hints, Map<String, Expression> parameters) { RenderedImage inputImage = inputWorker.getRenderedImage(); assert inputImage.getSampleModel().getNumBands() == 1 : inputImage; final int dataType = inputImage.getSampleModel().getDataType(); if (dataType == DataBuffer.TYPE_BYTE) { // // Optimisation for byte images m we use lookup // LookupTable table = createByteLookupTable(EMPTY_MAP); inputWorker.lookup(table); return inputWorker.getRenderedImage(); } // General case // define a specific piecewise for the logarithm // // STEP 1 do the extrema // inputWorker.removeRenderingHints(); final double[] minimum = inputWorker.getMinimums(); final double[] maximum = inputWorker.getMaximums(); // // STEP 2 use generic piecewise // final PiecewiseTransform1D<DefaultPiecewiseTransform1DElement> transform = generatePiecewise(setMinMaxParams(minimum[0], maximum[0])); inputWorker.piecewise(transform, Integer.valueOf(0)); return inputWorker.getRenderedImage(); }
try { setRenderingHints(newRi); lookup(lut); } finally {
inputWorker.lookup(table); return inputWorker.getRenderedImage();
.rangeLookup(lookupTable) .bandCombine(matrix) .lookup(LookupTableFactory.create(ALPHA_LUT)) .getRenderedImage();
/** * This takes an image with an indexed color model that uses less than 256 colors and has a 8bit * sample model, and transforms it to one that has the optimal sample model (for example, 1bit * if the palette only has 2 colors) * * @param source */ private static RenderedImage optimizeSampleModel(RenderedImage source) { int w = source.getWidth(); int h = source.getHeight(); ImageLayout layout = new ImageLayout(); layout.setColorModel(source.getColorModel()); layout.setSampleModel(source.getColorModel().createCompatibleSampleModel(w, h)); // if I don't force tiling off with this setting an exception is thrown // when writing the image out... layout.setTileWidth(w); layout.setTileHeight(h); RenderingHints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout); LookupTable table = LookupTableFactory.create(IDENTITY_TABLE); // TODO SIMONE why not format? ImageWorker worker = new ImageWorker(source); worker.setRenderingHints(hints); worker.lookup(table); return worker.getRenderedImage(); }