/* * Copyright (C) 2010-2012 Stichting Akvo (Akvo Foundation) * * This file is part of Akvo FLOW. * * Akvo FLOW is free software: you can redistribute it and modify it under the terms of * the GNU Affero General Public License (AGPL) as published by the Free Software Foundation, * either version 3 of the License or any later version. * * Akvo FLOW is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Affero General Public License included below for more details. * * The full license text can also be seen at <http://www.gnu.org/licenses/agpl.html>. */ package com.gallatinsystems.common.util; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; import javax.imageio.ImageIO; import javax.imageio.stream.ImageOutputStream; /** * Utility for resizing images */ public class ImageUtil { /** * generates a new image in the destImageDir with the same file name as the image file passed * in. NOTE: you cannot use this method to overwrite the source image (i.e. you cannot specify * the destDir as the same directory that houses the source image) * * @param image * @param destImageDir * @param width * @param height * @return */ public static File resizeImage(File image, String destImageDir, Integer width, Integer height) { String destFile = destImageDir + File.separator + image.getName(); File destFileObj = new File(destFile); if (image.getAbsolutePath().toLowerCase().contains(".jpg")) { if (image.length() > 0) { if (!destFileObj.exists()) { InputStream input; try { input = new FileInputStream(image); InputStream resizedImage = scaleImage(input, width, height); int data = resizedImage.read(); FileOutputStream output = new FileOutputStream(destFile); while (data != -1) { output.write(data); data = resizedImage.read(); } output.close(); input.close(); input = null; resizedImage.close(); resizedImage = null; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { System.out.println(" File already exists: " + destFile); } } } return destFileObj; } /** * resizes the image represented by the inputstream passed in into a new InputStream. The resize * will attempt to maintain the aspect ratio of the orginal image. * * @param p_image * @param p_width * @param p_height * @return * @throws Exception */ public static InputStream scaleImage(InputStream p_image, int p_width, int p_height) throws Exception { BufferedImage src = ImageIO.read(p_image); int thumbWidth = p_width; int thumbHeight = p_height; // Make sure the aspect ratio is maintained, so the image is not skewed double thumbRatio = (double) thumbWidth / (double) thumbHeight; int imageWidth = src.getWidth(null); int imageHeight = src.getHeight(null); double imageRatio = (double) imageWidth / (double) imageHeight; if (thumbRatio < imageRatio) { thumbHeight = (int) (thumbWidth / imageRatio); } else { thumbWidth = (int) (thumbHeight * imageRatio); } BufferedImage dest = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g = dest.createGraphics(); AffineTransform at = AffineTransform.getScaleInstance( (double) thumbWidth / src.getWidth(), (double) thumbHeight / src.getHeight()); g.drawRenderedImage(src, at); ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageOutputStream ios = ImageIO.createImageOutputStream(out); ImageIO.write(dest, "JPG", ios); ByteArrayInputStream bis = new ByteArrayInputStream(out.toByteArray()); return bis; } }