public BufferedImage filter( BufferedImage src, BufferedImage dst ) { int width = src.getWidth(); int height = src.getHeight(); int type = src.getType(); WritableRaster srcRaster = src.getRaster(); if ( dst == null ) dst = createCompatibleDestImage( src, null ); WritableRaster dstRaster = dst.getRaster(); setDimensions( width, height); int[] inPixels = new int[width]; for ( int y = 0; y < height; y++ ) { // We try to avoid calling getRGB on images as it causes them to become unmanaged, causing horrible performance problems. if ( type == BufferedImage.TYPE_INT_ARGB ) { srcRaster.getDataElements( 0, y, width, 1, inPixels ); for ( int x = 0; x < width; x++ ) inPixels[x] = filterRGB( x, y, inPixels[x] ); dstRaster.setDataElements( 0, y, width, 1, inPixels ); } else { src.getRGB( 0, y, width, 1, inPixels, 0, width ); for ( int x = 0; x < width; x++ ) inPixels[x] = filterRGB( x, y, inPixels[x] ); dst.setRGB( 0, y, width, 1, inPixels, 0, width ); } } return dst; }
public BufferedImage filter( BufferedImage src, BufferedImage dst ) { int width = src.getWidth(); int height = src.getHeight(); int type = src.getType(); WritableRaster srcRaster = src.getRaster(); if ( dst == null ) dst = createCompatibleDestImage( src, null ); WritableRaster dstRaster = dst.getRaster(); setDimensions( width, height); int[] inPixels = new int[width]; for ( int y = 0; y < height; y++ ) { // We try to avoid calling getRGB on images as it causes them to become unmanaged, causing horrible performance problems. if ( type == BufferedImage.TYPE_INT_ARGB ) { srcRaster.getDataElements( 0, y, width, 1, inPixels ); for ( int x = 0; x < width; x++ ) inPixels[x] = filterRGB( x, y, inPixels[x] ); dstRaster.setDataElements( 0, y, width, 1, inPixels ); } else { src.getRGB( 0, y, width, 1, inPixels, 0, width ); for ( int x = 0; x < width; x++ ) inPixels[x] = filterRGB( x, y, inPixels[x] ); dst.setRGB( 0, y, width, 1, inPixels, 0, width ); } } return dst; }
@Override public BufferedImage filter(BufferedImage src, BufferedImage dst) { int width = src.getWidth(); int height = src.getHeight(); setDimensions(width, height); if (dst == null) { dst = createCompatibleDestImage(src, null); } if (src.getType() == BufferedImage.TYPE_BYTE_GRAY) { return grayFilter(src, dst); } int[] inPixels = ImageUtils.getPixelsAsArray(src); int[] outPixels = ImageUtils.getPixelsAsArray(dst); pt = createProgressTracker(height); Future<?>[] futures = new Future[height]; for (int y = 0; y < height; y++) { int finalY = y; Runnable calculateLineTask = () -> { for (int x = 0; x < width; x++) { int index = finalY * width + x; outPixels[index] = filterRGB(x, finalY, inPixels[index]); } }; futures[y] = ThreadPool.submit(calculateLineTask); } ThreadPool.waitToFinish(futures, pt); finishProgressTracker(); return dst; }