Crop de imágenes JPG con Java Advanced Imaging API (JAI)

20 mayo, 2010

Etiquetas: , , , ,

Hoy la entrada será de nuevo una solución a un problema encontrado en el proyecto en el que trabajo actualmente. Y es que cuando quieres editar imágenes con Java las alternativas no son muchas y tampoco fáciles. Nosotros nos decidimos por utilizar Java Advanced Imaging API, una librería que no se actualiza desde 2007… bueno, no toca entrar a discutir este tema.

Vamos a entrar en materia. El código:

private byte[] cropImage(InputStream is, int topLeftmx, int topLeftmy, int roiWidth, int roiHeight, String tipoImagen) {
    // 1 - generar el crop
    SeekableStream s = SeekableStream.wrapInputStream(is, true);
    RenderedOp image = JAI.create("stream", s);
    ((OpImage)image.getRendering()).setTileCache(null);
    ParameterBlock pb = new ParameterBlock();
    pb.addSource(image);
    pb.add((float)topLeftmx);
    pb.add((float)topLeftmy);
    pb.add((float)roiWidth);
    pb.add((float)roiHeight);

    image = JAI.create("crop",pb);

    // 2 - codificar la imagen resultado del crop
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    JAI.create("encode", image, baos, tipoImagen, null); // 3
    return baos.toByteArray();
}

Básicamente esta función tiene 2 partes, la primera (1) donde se genera el crop de la imagen, y la segunda (2) donde se codifica la imagen resultado del crop realizado. Es decir, informar si la imagen es JPEG, PNG, TIFF…

Cuál es el problema que nos encontramos, si vamos a la línea marcada (3):

JAI.create("encode", image, baos, tipoImagen, null); // 3

estamos creando la codificación, indicando con la variable tipoImagen si se trata de una “JPEG” (“JPG” no funciona), “PNG”, “TIFF” o demás formatos soportados.

Funcionar funciona correctamente con cada uno de los tipos de imagen que le pasemos, excepto con “JPEG”. Con este tipo las coordenadas elegidas para realizar el crop sobre la imagen simplemente se pierden. No se porqué, pero se pierden.

La solución encontrada en java.net Forums, Thread: The crop operation seems to ignore (x,y) offset es la siguiente:

JAI.create("encode", image.getAsBufferedImage(), baos, tipoImagen, null); // 3

La solución es pasar la variable image (de tipo RenderedOp) a tipo BufferedImage en la función create de la clase JAI. Milagrosamente todo vuelve a funcionar, incluido el tipo “JPEG”.

2 comentarios a "Crop de imágenes JPG con Java Advanced Imaging API (JAI)" »
Comentario de edgar — 16 diciembre, 2011 @ 4:03

Hola veras soy nuevo en esto de la API JAI de java y me interesaria saber si tienes algunos ejemplos del comando MinFilter, MaxFilter y MedianFilter, de esta misma API, te lo agradeceria mucho si me puedes mandar los ejemplos.

Comentario de VictorR — 3 febrero, 2012 @ 10:19

Hola Edgar! pues lamento decirte que no, no tengo ejemplos… Veo que el proyecto ha pasado a ser parte Java.net, aquí podrás encontrar referencias y ejemplos http://java.net/projects/jai

Un saludo!

RSS feed para los comentarios de esta entrada. TrackBack URL

Deja tu comentario

* Obligatorio. ** Obligatorio, no será publicado.