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!
-
package es.gaea.utils;
-
-
import java.awt.RenderingHints;
-
import java.awt.geom.AffineTransform;
-
import java.awt.image.AffineTransformOp;
-
import java.awt.image.BufferedImage;
-
import java.io.File;
-
import java.io.IOException;
-
import javax.imageio.ImageIO;
-
import org.apache.log4j.Logger;
-
-
/** Clase que implementa un procesador para imagenes y juguetear con ellas */
-
public class ProcesadorImagenes {
-
-
/** Logger de la clase */
-
private static Logger logger = Logger.getLogger(ProcesadorImagenes.class);
-
-
/** Opciones de renderizado para las imagenes */
-
-
/** Constructor de la clase */
-
public ProcesadorImagenes() {
-
-
// Cargo las opciones de renderizado que me apetezcan
-
opciones.put(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
-
opciones.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
-
}
-
-
/** Devuelve la lista de formatos disponibles a leer por ImageIO
-
* @return un array de strings con los mismos.
-
*/
-
-
return ImageIO.getReaderFormatNames();
-
}
-
-
-
/** Calcula el factor de escala minimo y en base a eso
-
* escala la imagen segun dicho factor.
-
* @param nMaxWidth maximo tamaño para el ancho
-
* @param nMaxHeight nmaximo tamaño para el alto
-
* @param imagen Imagen que vamos a escalar
-
* @return Devuelve la imagen escalada para poderla trastocar o null si hay error
-
*/
-
final int maximoAncho, final int maximoAlto) {
-
-
// Comprobacion de parametros
-
if (imagen == null || maximoAlto == 0 || maximoAncho == 0) {
-
return null;
-
}
-
-
// Capturo ancho y alto de la imagen
-
int anchoImagen = imagen.getHeight();
-
int altoImagen = imagen.getWidth();
-
-
// Calculo la relacion entre anchos y altos de la imagen
-
double escalaX = (double)maximoAncho / (double)anchoImagen;
-
double escalaY = (double)maximoAlto / (double)altoImagen;
-
-
// Tomo como referencia el minimo de las escalas
-
-
// Devuelvo el resultado de aplicar esa escala a la imagen
-
return escalar(fEscala, imagen);
-
}
-
-
-
/** Escala una imagen en porcentaje.
-
* @param factorEscala ejemplo: factorEscala=0.6 (escala la imagen al 60%)
-
* @param srcImg una imagen BufferedImage
-
* @return un BufferedImage escalado
-
*/
-
-
// Comprobacion de parametros
-
if (srcImg == null) {
-
return null;
-
}
-
-
// Compruebo escala nula
-
if (factorEscala == 1 ) {
-
-
return srcImg;
-
}
-
-
// La creo con esas opciones
-
AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(factorEscala, factorEscala), opciones);
-
-
// Devuelve el resultado de aplicar el filro sobre la imagen
-
return op.filter(srcImg, null);
-
}
-
-
-
/** Metodo que guarda una imagen en disco
-
* @param imagen Imagen a almacenar en disco
-
* @param rutaFichero Ruta de la imagen donde vamos a salvar la imagen
-
* @param formato Formato de la imagen al almacenarla en disco
-
* @return Booleano indicando si se consiguio salvar con exito la imagen
-
*/
-
-
// Comprobacion de parametros
-
if (imagen != null && rutaFichero != null && formato != null) {
-
-
try {
-
return true;
-
// Fallo al guardar
-
if (logger.isDebugEnabled() == true) {
-
String CODIGO_MENSAJE_ERROR_GUARDADO_FICHERO =
-
"No se pudo guardar correctamente la imagen en " +
-
rutaFichero;
-
logger.debug(CODIGO_MENSAJE_ERROR_GUARDADO_FICHERO);
-
}
-
return false;
-
}
-
} else {
-
// Fallo en los parametros
-
return false;
-
}
-
}
-
-
-
/** Metodo principal de la clase. Usado como prueba
-
* @param args Argumentos del metodo
-
*/
-
-
// Variables locales
-
BufferedImage imagen;
-
-
try {
-
ProcesadorImagenes pi = new ProcesadorImagenes();
-
-
// Escalo algunas imagenes como pruebas
-
-
// Las salvo en disco
-
pi.salvarImagen(imagen800_600,"imagenG.jpg","jpg");
-
pi.salvarImagen(imagenSnap_Shot,"imagenP.jpg","jpg");
-
pi.salvarImagen(imagenSnap_Shot,"imagenE.png","PNG");
-
pi.salvarImagen(imagenMediana,"imagenA.gif","gif");
-
-
// Extraigo la lista de formatos capaces de leer
-
-
// los voy mostrando
-
for (int i=0; i <formatos.length; i++) {
-
}
-
-
// Final del metodo con exito
-
e.printStackTrace();
-
}
-
}
-
}

