Criar nova imagem redimensionada

Opa…

Existe uma maneira de eu, a partir de uma imagem, criar uma cópia dela com um tamanho menor?
Explicando oque eu preciso:
Quando o usuário fizer o upload de uma imagem, eu preciso que ele salve essa mesma imagem em outro lugar, também, com seu tamanho reduzido. Por exemplo, todas as imagens que foram feitas upload, deverão ser salvas na pasta thumbs com o tamanho de 10x10.

Valeu

Estou desenvolvendo uma aplicação que faz exatamente isso. Este codigo é para imagens jpg mas se vc quiser usar outros formatos (gif, png, tirf) é só alterar o codec.
Espero ter ajudado.

//Codigo:
package com.banco;

import com.sun.image.codec.jpeg.JPEGImageDecoder;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.image.codec.jpeg.JPEGEncodeParam;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.InputStream;
import java.awt.image.BufferedImage;
import java.awt.image.AffineTransformOp;
import java.awt.geom.AffineTransform;
import java.awt.*;

public class ResizeImage {

public boolean resizeImage(InputStream source, OutputStream dest, int nWidth, int nHeight) throws Exception {

    boolean backimageresize = false;

    JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(source);
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(dest);

    // made instance variable for efficiency reasons
    BufferedImage sourceImg = decoder.decodeAsBufferedImage();
    BufferedImage imgThumb  = scaleToSize(nWidth, nHeight, sourceImg);

    JPEGEncodeParam param = JPEGCodec.getDefaultJPEGEncodeParam(imgThumb);
    param.setQuality(0.8F, false);
    encoder.encode(imgThumb, param);
    encoder.encode(imgThumb);

    backimageresize = true;
    return backimageresize;
}

public static BufferedImage scaleToSize(int nMaxWidth, int nMaxHeight, BufferedImage imgSrc) {
    int nHeight = imgSrc.getHeight();
    int nWidth  = imgSrc.getWidth();
    double scaleX = (double)nMaxWidth / (double)nWidth;
    double scaleY = (double)nMaxHeight / (double)nHeight;
    double fScale = Math.min(scaleX, scaleY);
    return scale(fScale, imgSrc);
}

public static BufferedImage scale(double scale, BufferedImage srcImg) {
    if (scale == 1 ) {
        return srcImg;
    }
    AffineTransform xform = AffineTransform.getScaleInstance(scale, scale);

    RenderingHints hints = new RenderingHints(RenderingHints.KEY_RENDERING,
                                              RenderingHints.VALUE_RENDER_QUALITY);

    AffineTransformOp op = new AffineTransformOp(xform, hints);

    BufferedImage dstImg = op.createCompatibleDestImage(srcImg,
    srcImg.getColorModel());

    return op.filter(srcImg, dstImg);

}

public static void main(String [] args){
    ResizeImage imagem = new ResizeImage();
    try {
        imagem.resizeImage(new FileInputStream("Missao_impossivel.jpg"),
                           new FileOutputStream("testeImagem.jpg"),300,200);
    } catch (Exception e) {
        e.printStackTrace();  //To change body of catch statement use Options | File Templates.
    }
}

}