Reducir imagenes

Olga
17 de Octubre del 2005
Hola!

Tengo una imagen y la kiero reducir para que entre en un boton. Tengo el siguiente código, guardo la imagen y se me guarda entera negra xq puede ser? alguien me puede ayudar????

public class Imagenes {

public void creaImagenReducida( String origen, String imgReducida, int maxDim)
{

// Carga la imagen desde el fichero
Image imagen = new ImageIcon(origen).getImage();

// Determina la escala
double escala = (double)maxDim / (double)imagen.getHeight(null);
if(imagen.getWidth(null) > imagen.getHeight(null))
{
escala = (double)maxDim / (double)imagen.getWidth(null);
}

// Calcula el tamaño de la nueva imagen. Una de las
// dimensiones ha de ser igual a maxDim
int escalaAncho = (int)(escala * imagen.getWidth(null));
int escalaAlto = (int)(escala * imagen.getHeight(null));

// Crear un buffer sobre el cual se va a dibujar la imagen
BufferedImage imgFinal = new BufferedImage(escalaAncho, escalaAlto, BufferedImage.TYPE_USHORT_GRAY);

// Fija la escala
AffineTransform transformador = new AffineTransform();

// Si la imagen es más pequeña que el tamaño que se ha
// indicado en la llamada, no se realiza el escalado
System.out.println(escala+"/n"+ escalaAncho+"/n"+ escalaAlto);
if(escala < 1.0d)
{
transformador.scale(escala, escala);
}

// Dibuja la imagen
Graphics2D g2 = imgFinal.createGraphics();
g2.drawImage(imagen, transformador, null);
g2.dispose();

//return g2;


guardaImagen(imgFinal, imgReducida);

}

public void guardaImagen(BufferedImage imgFinal, String imgReducida)
{
// Codifica la imagen como jpeg y la graba en un fichero
OutputStream salida = null;
try {
salida = new FileOutputStream(imgReducida);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(salida);
encoder.encode(imgFinal);
salida.close();
} catch (IOException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}


}

}

Muchas gracias. Saludos.

chuidiang
17 de Octubre del 2005
Hola:

El escalado y el AffineTransform son muy puñeteros. Si te equivocas lo más mínimo (y es lo habitual) lo normal es que la imagen se vaya fuera de tu area de dibujo y por eso sale negra. A mi me dio muchos quebraderos de cabeza hasta que fui capaz de dar con las cuentas correctas.

De todas formas, para obtener una imagen a escala, puedes usar el método getScaledInstance() de la clase Image.

Se bueno.