private BufferedImage scaleImage(int maxWidth, int maxHeight, ImageInputStream imageInputStream) throws IOException {
final Optional<ImageReader> imageReader = ThumbnailUtil.getFirstImageReader(imageInputStream);
if (!imageReader.isPresent()) {
throw new IOException("Cannot read the image");
}
final ImageReader reader = imageReader.get();
try {
reader.setInput(imageInputStream);
final ThumbnailDimension originalImageDimensions = new ThumbnailDimension(reader.getWidth(0), reader.getHeight(0));
final ThumbnailDimension scaledImageDimension = ThumbnailUtil.determineScaledDimensions(maxWidth, maxHeight, originalImageDimensions.getWidth(), originalImageDimensions.getHeight());
final int ratio = ThumbnailUtil.computeSubsamplingRatio(originalImageDimensions, scaledImageDimension, samplingFactor);
final ImageReadParam param = reader.getDefaultReadParam();
param.setSourceSubsampling(ratio, ratio, 0, 0);
final BufferedImage scaledImage = reader.read(0, param);
return scaleImage(scaledImage, scaledImageDimension);
} finally {
reader.dispose();
}
}