Resolvi compartilhar um gerador de thumbnail de imagens muito util que sempre utilizo.Basicamente o codigo recebe o arquivo de origem, o destino, a largura e a altura maxima do thumbnail a ser gerado. E tudo muito simples e requer apenas a biblioteca padrao awt do Java.Primeiro vamos ler o arquivo de origem:FileInputStream input = new FileInputStream(source);BufferedImage bufImage = ImageIO.read(input);Agora precisamos calcular o scale, que sera o indice para redimensionar a area da imagem. Se a altura original da imagem for maior, o scale sera o resultado da divisao da altura do thumb pela altura original. E vice- versa.double scale1 = (double) width / (double) bufImg.getWidth();double scale2 = (double) height / (double) bufImg.getHeight(); double resultScale = scale1 > scale2 ? scale2 : scale1;Utilizando o resultado obtido para o calculo do redimensionamento:int realWidth = bufImg.getWidth();int realHeigth = bufImg.getHeight();BufferedImage imageScaled = new BufferedImage((int) ( w * resultScale), (int) (h * resultScale), BufferedImage.TYPE_INT_RGB);So o BufferedImage gerado nao basta. E necessario, por fim, desenhar os graficos da imagem novamente com os novos parametros calculados:Graphics2D g2 = scaled.createGraphics();g2.setComposite(AlphaComposite.Src);g2.drawImage(img.getScaledInstance((int) (realWidth * resultScale), (int) (realHeigth * resultScale), Image.SCALE_SMOOTH), 0, 0, (int) (w * resultScale), (int) (h * resultScale), null);g2.dispose();// Escrevendo no arquivo de saidaImageIO.write(imageScaled, "JPG", output);Codigo completo:public class ThumbGenerator { public static boolean generate (File source, File dest, int height, int width) throws IOException { if (source != null && dest != null) { FileInputStream input = new FileInputStream(source); try { BufferedImage bufImage = ImageIO.read(input); if(bufImage != null) { double scale = calcScale(bufImage, width, height); BufferedImage imageScaled = scale(bufImage, scale); FileOutputStream fos = new FileOutputStream(dest); ImageIO.write(imageScaled, "JPG", fos); fos.close(); input.close(); return true; } } catch (Exception e) { e.printStackTrace(); } } return false; } private static double calcScale(BufferedImage img, int width, int height) { double scale1 = (double) width / (double) img.getWidth(); double scale2 = (double) height / (double) img.getHeight(); double scale = scale1 > scale2 ? scale2 : scale1; return scale; } private static BufferedImage scale(BufferedImage img, double scale) { int w = img.getWidth(); int h = img.getHeight(); BufferedImage scaled = new BufferedImage((int) (w * scale), (int) (h * scale), BufferedImage.TYPE_INT_RGB); Graphics2D g2 = scaled.createGraphics(); g2.setComposite(AlphaComposite.Src); g2.drawImage(img.getScaledInstance((int) (w * scale), (int) (h * scale), Image.SCALE_SMOOTH), 0, 0, (int) (w * scale), (int) (h * scale), null); g2.dispose(); return scaled; }}Dai e so chamar:ThumbGenerator.generate(imgSource, output, 400, 400); // Ver resultado no arquivo outputThumbGenerator.generate(imgSource, output, 400, 600); ThumbGenerator.generate(imgSource, output, 600, 400); ThumbGenerator.generate(imgSource, output, 100, 100); AS INDAGACOESA resposta certa, nao importa nada: o essencial e que as perguntas estejam certas. "Na convivencia, o tempo nao importa.Se for um minuto,uma hora, uma vida.O qu...e importa, e o que ficou deste minuto,desta hora... desta vida..."(Mario Quintana) nao entendo. isso e tao vasto que ultrapassa qualquer entender. entender e sempre limitado. mas nao entender pode nao ter fronteiras. sinto que sou muito mais completa quando nao entendo. nao entender, do modo como falo, e um dom. nao entender, mas nao como um simples de espirito. o bom e ser inteligente e nao entender. e uma bencao estranha, como ter loucura sem ser doida. e um desinteresse manso, e uma docura de burrice. so que