You can draw original image into lower color depth image using code like this:
BufferedImage origImage = ImageIO.read(new File(args[0]));
BufferedImage lowImage = new BufferedImage(
origImage.getWidth(), origImage.getHeight(),
BufferedImage.TYPE_USHORT_555_RGB);
lowImage.getGraphics().drawImage(origImage,0,0,null);
So, if there is no more usage of the origImage it will be collected and you will have lower memory usage. I've checked the approach above with 1932X2576 image and it saves me 5mb memory comparing with just using origImage.
If you're ok with subsampling you can try this approach which will reduce your memory consumption by 75%.
ImageInputStream iis = ImageIO.createImageInputStream(new File("d:/IMG_5167.JPG"));
Iterator<ImageReader> iter = ImageIO.getImageReaders(iis);
ImageReader reader = iter.next();
reader.setInput(iis);
ImageReadParam param = reader.getDefaultReadParam();
param.setSourceSubsampling(2, 2, 0, 0);
BufferedImage image = reader.read(0, param);
The added value here is that you don't load the full image at any time, whereas all the other solutions that you can find involve loading the full image first which means using the full memory size of the image for a certain period of time.