/** Records a new size. Called by the AWT. */ public void setBounds(int x, int y, int width, int height) { Insets insets = getInsets(); int w; int h; if (source == null) { w = width; h = height; } else { w = source.getWidth(); h = source.getHeight(); if (width < w) { w = width; } if (height < h) { h = height; } } componentWidth = w + insets.left + insets.right; componentHeight = h + insets.top + insets.bottom; super.setBounds(x + shift_x, y + shift_y, componentWidth, componentHeight); }
@Override protected void computeRect( final PlanarImage[] sources, final WritableRaster dest, final Rectangle destRect) { final PlanarImage source = sources[0]; final Rectangle bounds = destRect.intersection(source.getBounds()); if (!destRect.equals(bounds)) { // TODO: Check if this case occurs sometime, and fill pixel values if it does. // If it happen to occurs, we will need to fix other GeoTools operations // as well. Logging.getLogger(TransformException.class) .warning("Bounds mismatch: " + destRect + " and " + bounds); } WritableRectIter iterator = RectIterFactory.createWritable(dest, bounds); // TODO: Detect if source and destination rasters are the same. If they are // the same, we should skip this block. Iteration will then be faster. iterator = TransfertRectIter.create(RectIterFactory.create(source, bounds), iterator); if (!iterator.finishedBands()) { do { recode(iterator); } while (!iterator.nextBandDone()); } }
private synchronized void computeHistogram(Rectangle visibleRect, PlanarImage image) { int channels = image.getSampleModel().getNumBands(); Histogram hist = new Histogram(256, 256, 512, channels); bins = hist.getBins(); // Raster raster = image.getData(visibleRect); Rectangle bounds = visibleRect; // image.getBounds(); int pixel[] = null; int maxPixels = 256; int incX = bounds.width >= 2 * maxPixels ? bounds.width / maxPixels : 1; int incY = bounds.height >= 2 * maxPixels ? bounds.height / maxPixels : 1; double log2 = Math.log(2); int minTileX = image.XToTileX(bounds.x); int maxTileX = image.XToTileX(bounds.x + bounds.width - 1); int minTileY = image.YToTileY(bounds.y); int maxTileY = image.YToTileY(bounds.y + bounds.height - 1); for (int tx = minTileX; tx <= maxTileX; tx++) for (int ty = minTileY; ty <= maxTileY; ty++) { Raster raster = image.getTile(tx, ty); int minX = Math.max(bounds.x, raster.getMinX()); int maxX = Math.min(bounds.x + bounds.width, raster.getMinX() + raster.getWidth()); int minY = Math.max(bounds.y, raster.getMinY()); int maxY = Math.min(bounds.y + bounds.height, raster.getMinY() + raster.getHeight()); for (int x = minX; x < maxX; x += incX) for (int y = minY; y < maxY; y += incY) { pixel = raster.getPixel(x, y, pixel); for (int c = 0; c < channels; c++) { int v = (int) (511 * logTable[pixel[c]] / (16 * log2)); if (v > 255) bins[c][v - 256]++; else bins[c][0]++; } } } bins = hist.getBins(); }
/** Initializes the ImageDisplay. */ private synchronized void initialize() { if (source == null) return; componentWidth = source.getWidth(); componentHeight = source.getHeight(); setPreferredSize(new Dimension(componentWidth, componentHeight)); this.sampleModel = source.getSampleModel(); // First check whether the opimage has already set a suitable ColorModel this.colorModel = source.getColorModel(); if (this.colorModel == null) { // If not, then create one. this.colorModel = PlanarImage.createColorModel(this.sampleModel); if (this.colorModel == null) { throw new IllegalArgumentException("no color model"); } } minTileX = source.getMinTileX(); maxTileX = source.getMinTileX() + source.getNumXTiles() - 1; minTileY = source.getMinTileY(); maxTileY = source.getMinTileY() + source.getNumYTiles() - 1; tileWidth = source.getTileWidth(); tileHeight = source.getTileHeight(); tileGridXOffset = source.getTileGridXOffset(); tileGridYOffset = source.getTileGridYOffset(); }
/** * Paint the image onto a Graphics object. The painting is performed tile-by-tile, and includes a * grey region covering the unused portion of image tiles as well as the general background. At * this point the image must be byte data. */ public synchronized void paintComponent(Graphics g) { Graphics2D g2D = null; if (g instanceof Graphics2D) { g2D = (Graphics2D) g; } else { return; } // if source is null, it's just a component if (source == null) { g2D.setColor(getBackground()); g2D.fillRect(0, 0, componentWidth, componentHeight); return; } int transX = -originX; int transY = -originY; // Get the clipping rectangle and translate it into image coordinates. Rectangle clipBounds = g.getClipBounds(); if (clipBounds == null) { clipBounds = new Rectangle(0, 0, componentWidth, componentHeight); } // clear the background (clip it) [minimal optimization here] if (transX > 0 || transY > 0 || transX < (componentWidth - source.getWidth()) || transY < (componentHeight - source.getHeight())) { g2D.setColor(getBackground()); g2D.fillRect(0, 0, componentWidth, componentHeight); } clipBounds.translate(-transX, -transY); // Determine the extent of the clipping region in tile coordinates. int txmin, txmax, tymin, tymax; int ti, tj; txmin = XtoTileX(clipBounds.x); txmin = Math.max(txmin, minTileX); txmin = Math.min(txmin, maxTileX); txmax = XtoTileX(clipBounds.x + clipBounds.width - 1); txmax = Math.max(txmax, minTileX); txmax = Math.min(txmax, maxTileX); tymin = YtoTileY(clipBounds.y); tymin = Math.max(tymin, minTileY); tymin = Math.min(tymin, maxTileY); tymax = YtoTileY(clipBounds.y + clipBounds.height - 1); tymax = Math.max(tymax, minTileY); tymax = Math.min(tymax, maxTileY); Insets insets = getInsets(); // Loop over tiles within the clipping region for (tj = tymin; tj <= tymax; tj++) { for (ti = txmin; ti <= txmax; ti++) { int tx = TileXtoX(ti); int ty = TileYtoY(tj); Raster tile = source.getTile(ti, tj); if (tile != null) { DataBuffer dataBuffer = tile.getDataBuffer(); WritableRaster wr = tile.createWritableRaster(sampleModel, dataBuffer, null); BufferedImage bi = new BufferedImage(colorModel, wr, colorModel.isAlphaPremultiplied(), null); // correctly handles band offsets if (brightnessEnabled == true) { SampleModel sm = sampleModel.createCompatibleSampleModel(tile.getWidth(), tile.getHeight()); WritableRaster raster = RasterFactory.createWritableRaster(sm, null); BufferedImage bimg = new BufferedImage(colorModel, raster, colorModel.isAlphaPremultiplied(), null); // don't move this code ByteLookupTable lutTable = new ByteLookupTable(0, lutData); LookupOp lookup = new LookupOp(lutTable, null); lookup.filter(bi, bimg); g2D.drawImage(bimg, biop, tx + transX + insets.left, ty + transY + insets.top); } else { AffineTransform transform; transform = AffineTransform.getTranslateInstance( tx + transX + insets.left, ty + transY + insets.top); g2D.drawRenderedImage(bi, transform); } } } } }
public PlanarImage setFront() { if (chroma_domain == 0 && chroma_range == 0 && luma_domain == 0 && luma_range == 0) return back; PlanarImage front = back; ColorScience.LinearTransform transform = new ColorScience.YST(); double[][] rgb2yst = transform.fromRGB(back.getSampleModel().getDataType()); double[][] yst2rgb = transform.toRGB(back.getSampleModel().getDataType()); ParameterBlock pb = new ParameterBlock(); pb.addSource(back); pb.add(rgb2yst); RenderedOp ystImage = JAI.create("BandCombine", pb, null); RenderingHints mfHints = new RenderingHints( JAI.KEY_BORDER_EXTENDER, BorderExtender.createInstance(BorderExtender.BORDER_COPY)); if (chroma_domain != 0 && chroma_range != 0) { pb = new ParameterBlock(); pb.addSource(ystImage); pb.add(chroma_domain * scale); pb.add(0.02f + 0.001f * chroma_domain); // pb.add(0.1f); ystImage = JAI.create("BilateralFilter", pb, mfHints); ystImage.setProperty(JAIContext.PERSISTENT_CACHE_TAG, Boolean.TRUE); } if (luma_domain != 0 && luma_range != 0) { pb = new ParameterBlock(); pb.addSource(ystImage); pb.add(new int[] {0}); RenderedOp y = JAI.create("bandselect", pb, null); pb = new ParameterBlock(); pb.addSource(ystImage); pb.add(new int[] {1, 2}); RenderedOp cc = JAI.create("bandselect", pb, JAIContext.noCacheHint); pb = new ParameterBlock(); pb.addSource(y); pb.add((2 + luma_domain / 10f) * scale); pb.add(0.005f * luma_domain); y = JAI.create("BilateralFilter", pb, mfHints); RenderingHints layoutHints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, Functions.getImageLayout(ystImage)); pb = new ParameterBlock(); pb.addSource(y); pb.addSource(cc); layoutHints.add(JAIContext.noCacheHint); ystImage = JAI.create("BandMerge", pb, layoutHints); } pb = new ParameterBlock(); pb.addSource(ystImage); pb.add(yst2rgb); front = JAI.create("BandCombine", pb, null); front.setProperty(JAIContext.PERSISTENT_CACHE_TAG, Boolean.TRUE); return front; }