BufferedImageFilter (boolean flipV, boolean flipH) { return new BufferedImageFilter(new BufferedImageOp() { @Override public BufferedImage filter(BufferedImage src, BufferedImage dest) { AffineTransform tx = AffineTransform.getScaleInstance(flipH ? -1 : 1, flipV ? -1 : 1); tx.translate(flipH ? -src.getWidth(null) : 0, flipV ? -src.getHeight(null) : 0); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); return op.filter(src, dest); } @Override public Rectangle2D getBounds2D(BufferedImage src) { return null;} @Override public BufferedImage createCompatibleDestImage(BufferedImage src, ColorModel destCM) { return null;} @Override public Point2D getPoint2D(Point2D srcPt, Point2D dstPt) { return null;} @Override public RenderingHints getRenderingHints() { return null;} }); }