@Override public void extend(WritableRaster raster, PlanarImage sourceImage) { int dataType = raster.getSampleModel().getDataType(); switch (dataType) { case DataBuffer.TYPE_BYTE: extendAsByte(raster, sourceImage); break; case DataBuffer.TYPE_SHORT: extendAsShort(raster, sourceImage); break; case DataBuffer.TYPE_USHORT: extendAsUShort(raster, sourceImage); break; case DataBuffer.TYPE_INT: extendAsInt(raster, sourceImage); break; case DataBuffer.TYPE_FLOAT: extendAsFloat(raster, sourceImage); break; case DataBuffer.TYPE_DOUBLE: extendAsDouble(raster, sourceImage); break; default: throw new UnsupportedOperationException("Unsupported data type"); } }
private void extendAsShort(WritableRaster raster, PlanarImage sourceImage) { Rectangle bounds = sourceImage.getBounds(); Rectangle samplingBounds = new Rectangle(0, 0, 2 * maxDistance + 1, 2 * maxDistance + 1); RandomIter srcIter = RandomIterFactory.create(sourceImage, bounds); int[] pixel = new int[raster.getNumBands()]; for (int y = raster.getMinY(), ny = 0; ny < raster.getHeight(); y++, ny++) { for (int x = raster.getMinX(), nx = 0; nx < raster.getWidth(); x++, nx++) { if (!bounds.contains(x, y)) { samplingBounds.setLocation(x - maxDistance, y - maxDistance); Rectangle sourceSamplingBounds = samplingBounds.intersection(bounds); int sx = rand.nextInt(sourceSamplingBounds.width) + sourceSamplingBounds.x; int sy = rand.nextInt(sourceSamplingBounds.height) + sourceSamplingBounds.y; srcIter.getPixel(sx, sy, pixel); for (int b = 0; b < raster.getNumBands(); b++) { raster.setSample(x, y, b, clamp(pixel[b], Short.MIN_VALUE, Short.MAX_VALUE)); } } } } }