public static ThumbnailDimension determineScaledDimensions(int maxWidth, int maxHeight, int imageWidth, int imageHeight) { if (maxHeight > imageHeight && maxWidth > imageWidth) { return new ThumbnailDimension(imageWidth, imageHeight); } // Determine scale size. // Retain original image proportions with scaled image. double thumbRatio = (double) maxWidth / (double) maxHeight; double imageRatio = (double) imageWidth / (double) imageHeight; if (thumbRatio < imageRatio) { return new ThumbnailDimension(maxWidth, (int) Math.max(1, maxWidth / imageRatio)); } else { return new ThumbnailDimension((int) Math.max(1, maxHeight * imageRatio), maxHeight); } }
public static ThumbnailDimension dimensionsForImage(final @Nonnull InputStream inputStream) throws IOException { final BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); try { final ImageInputStream imageInputStream = getImageInputStream(inputStream); try { final Optional<ImageReader> imageReader = getFirstImageReader(imageInputStream); if (!imageReader.isPresent()) { throw new IOException("There is no ImageReader available for the given ImageInputStream"); } // Use the first one available final ImageReader reader = imageReader.get(); try { reader.setInput(imageInputStream); return new ThumbnailDimension(reader.getWidth(0), reader.getHeight(0)); } finally { reader.dispose(); } } finally { imageInputStream.close(); } } finally { IOUtils.closeQuietly(bufferedInputStream); } }
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); //Subsampling does not return an exact size of an image - we need to resize it return scaleImage(scaledImage, scaledImageDimension); } finally { reader.dispose(); } }