electroduendes.com

bitácora de un desarrollador interactivo

electroduendes.com header image 3

Procesado de imágenes en Java

Llevo unos cuatro años ya trabajando en proyectos con Java y nunca había tenido que trabajar con la API de imágenes que Sun proporciona. Bueno, pues ahora estoy embarcado en un pequeño proyecto en el cual había que procesar imágenes.

Como siempre me pasa, debido a tiempos, prefiero tirar de google y mirar lo que alguien ha andado y defenderme como buenamente puedo, antes que estudiar a fondo la API. Craso error. Después de dar vueltas sobre código algo obsoleto, descubro la clase ImageIO, disponible a partir de la versión 1.4, más potente para estos menesteres.

No es una panacea de clase, pero seguro que ayuda a más de un despistado como yo hace un par de días.

Actualización: Javier Murillo me manda una actualización de la clase. Está publicada en el siguiente hilo
[java]
/*
* ImageUtils.java
*
* Created on 20 de julio de 2005, 11:47
* Resizes jpeg image files on your file system.
* Uses the com.sun.image.codec.jpeg package shipped
* by Sun with Java 2 Standard Edition.
*
* @author Randy Belknap
* @revision Alejandro Sánchez Marcos
* se aprovecha la nueva clase ImageIO de 1.4
* y se añaden algunos métodos nuevos
*/

package com.electroduendes.util.image;

import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import org.apache.log4j.Logger;

/**

*/
public class ImageUtils {
static Logger logger = Logger.getLogger(ImageUtils.class);
/*
* devuelve la lista de formatos disponibles a leer por ImageIO
* @return un array de strings con los mismos.
*/
public static String[] getAvailableFormats(){
return ImageIO.getReaderFormatNames();
}

/*
* devuelve una imagen (buffer) en función de la ruta de un archivo
* mejoras
* @param la ruta del archivo con su nombre
* @return BufferedImage la imagen en el buffer
*/
public static BufferedImage loadBufferedImage(String fileName) {
BufferedImage image = null;
try {
/*FileInputStream fis = new FileInputStream(fileName);JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(fis);bi = decoder.decodeAsBufferedImage();fis.close();*/
// MAS RAPIDO a partir de 1.4
image = ImageIO.read( new File( fileName ) );
}
catch (Exception e) {
logger.debug(”error al intentar leer la imágen”);
return null;
}
return image;

}
/**
* comprueba que la imágen tiene un mínimo en pixels
* width y height tienen que tener un tamaño igual o mayor que el pasado
* como argumento
*
* @param w ancho mínimo
* @param h alto mínimo
* @return true o false
*
*/
public static boolean isGreaterThanMinSize(int w, int h, BufferedImage imgSrc){
int nHeight = imgSrc.getHeight();
int nWidth = imgSrc.getWidth();
if ((nHeight return false;
} else {
return true;
}
}

/*
* calcula el factor de escala mínimo y en base a eso escala la imagen
* según el dicho factor.
* @param nMaxWidth minimo tamaño para el ancho
* @param nMaxHeight minimo tamaño para el alto
* @param imgSrc la imágen
*/
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);
}

/*
* escala una imagen en porcentaje.
* @param scale ejemplo: scale=0.6 (escala la imágen al 60%)
* @param srcImg una imagen BufferedImage
* @return un BufferedImage escalado
*/
public static BufferedImage scale(double scale, BufferedImage srcImg) {
if (scale == 1 ) {
return srcImg;
}
AffineTransformOp op = new AffineTransformOp
(AffineTransform.getScaleInstance(scale, scale), null);

return op.filter(srcImg, null);

}

public static void saveImageToDisk(BufferedImage bi, String str, String format) {
if (bi != null && str != null) {

// más rápido con ImageIO
try {
ImageIO.write( bi, format /* formato */, new File( str ) /* destino */ );
} catch (Exception e){}
}
}

public static void main(String args[]) {
if(args.length != 3){usage();}
System.out.println(args[0]);
BufferedImage bImg = loadBufferedImage(args[0]);
System.out.println(bImg);
BufferedImage bImgEscaladaG = scaleToSize(800, 600, bImg);
BufferedImage bImgEscaladaP = scaleToSize(320, 200, bImg);

saveImageToDisk(bImgEscaladaG, args[1],”JPEG”);
saveImageToDisk(bImgEscaladaP, args[2],”JPEG”);
System.exit(0);
}

public static void usage(){
System.out.println(”usage: java ImageUtils archivo_original imagen_grande imagen_pequeña “);
System.exit(1);
}

}
[/java]

11 Comments

11 responses so far ↓

  • 1 » Procesado de imágenes en Java - electroduendes.com // Jul 24, 2007 at 1:15 pm

    [...] Login Procesado de imágenes en Java [...]

  • 2 electroduendes.com » Procesado de imágenes en Java II // Jul 24, 2007 at 1:28 pm

    [...] Javier Murillo me manda una mejora para la clase ImageUtils que publiqué en la entrada procesado de imágenes en Java. Es una alegría saber que otros desarrolladores trabajen con el código que publico, y que, como en este caso, se interesan por mejorarlo y reenviarlo. Gracias Javier! PLAIN TEXT JAVA: [...]

  • 3 ratman // Nov 13, 2008 at 3:38 am

    Disculpa necesitaria saber que licencia tiene el codigo, Si es GPL o no

    Muchas gracias

  • 4 edwin // Nov 21, 2008 at 9:16 am

    Hola,
    yo quiero cambiar el tamaño a una imagen y luego pintarla con su nuevo tamaño. Gracias.

  • 5 sacha // Jul 10, 2009 at 7:43 pm

    El package “com.electroduendes.util.image” ke se encuentra al principio de la clase? donde lo encuentro? o puedo presindir de el o con cual lo puedo reemplazar ? gracias por su atencion

  • 6 VICENTE // Nov 22, 2009 at 9:52 pm

    Tengo un problema y es que he introducido en mi web unas imagenes para activar y desactivar el sonido en java pero me sale el fondo blanco de las imagenes y me gustaria que fueran transparentes, te mando las instrucciones

  • 7 julio // Jan 11, 2010 at 1:38 am

    Excelente, muchas gracias, lo que andaba buscando y me hacia falta fue el scale.

  • 8 Espinel // Jan 19, 2010 at 4:28 pm

    Necesito saber como medir una imagen en java o sea que distancia dada una conocida me diga una que yo le marque con el click del mause.

  • 9 Yeison // Jan 26, 2010 at 9:22 pm

    Excelente forma de ajustar las imagenes.

  • 10 LAURA // Feb 10, 2010 at 1:20 am

    hola alguien de ustedes sabe como visualizar imagenes con applets en java de forma que al dar click en un boton que su funcion es cambiar cambie las imagenes???
    thanks

  • 11 Alejandro // May 20, 2010 at 7:36 am

    La respuesta a Sacha es que â??com.electroduendes.util.imageâ? es el paquete en el que está la clase, al crear la clase el paquete se pone automáticamente, puede ser cualquier paquete que hayas creado

Leave a Comment