Reducir imagenes
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.
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.
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.
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.