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”.

El Triángulo Imposible

28 diciembre, 2008

Etiquetas: , ,

Hace algunos años, cuando en una empresa, cuyo nombre no quiero recordar, estaba en pleno proceso de formación, aprendí lo que era el triángulo imposible. Algo que parece tan obvio y tan evidente como que las cosas se tienen que hacer bien, no lo es tanto a ojos de un cliente obsesionado con el tiempo y la fecha de “entrega” del proyecto. Lo digo por experiencia.

Según el triángulo imposible puedes seleccionar sólo 2 de sus 3 opciones, es decir 2 de sus 3 vértices. Estas opciones son dinero, calidad y tiempo.

Y las combinaciones posibles son las siguientes:

Si seleccionas que el producto sea bueno y barato el proceso de desarrollo no puede ser rápido.
Si seleccionas bueno y rápido no puede ser barato.
Y si seleccionas rápido y barato no puede ser bueno.

Por favor, no elijas la última! nunca!

Proyectos a dos partes.

23 noviembre, 2007

Etiquetas: ,

Una situación, un ejemplo.

Qué pasa cuando un proyecto depende de dos empresas distintas? y además, la fecha de entrega está muy cerca? pues que estas empiezan una guerra de a ver quién lo hace peor que la otra. Ya no se trata de acabar el trabajo a tiempo (porque no se va a conseguir), se trata de hacer ver al cliente que el trabajo no ha sido acabado a tiempo por culpa de la otra empresa.

Y cómo conseguirlo? Buscando el fallo ajeno hasta encontrarlo y entonces publicarlo hasta en La Vanguardia.

Es triste, pero entonces se entra en una borágine de dimes y diretes que no hace más que enrarecer el ambiente de trabajo, y lo que debería ser un trabajo entre dos equipos se convierte en una guerra.

Esto es lo que me acaba de pasar. El proyecto en el que trabajo actualmente depende del desarrollo de otra empresa, y como no llegan a tiempo a la fecha de entrega buscan el escudo necesario para que no les salpique la mierda.

Yo no soy perfecto, ni creo que mi trabajo haya sido tan perfecto como para que a estas alturas no tenga ningún problema. Los tiene. Pero, si el cliente ha aguantado lo que ha aguantado, lleva ya aguantándolos solo en este proyecto 9 meses, para algo que se debería haber acabado en como mucho 3, no creo que le venga de una semana más. El cliente es suficientemente listo como para darse cuenta de lo que pasa y ha pasado, está de sobras enterado. Lo único que pido es no ser tan canalla y no acabar con el trabajo a bombazos.

Esto es solo un ejemplo, no quiero decir que siempre tenga que pasar lo mismo en otros casos. Pero quería desahograme y recordar un post que he leído recientemente en Linked: El factor humano aunque aquí los tiros van por otro lado.

Hasta la próxima.