2011-03-03 15 views
18

estoy tratando de hacer lo siguiente código:¿Cómo se cosecha una región de imagen en Java?

private void crop(HttpServletRequest request, HttpServletResponse response){ 
    int x = 100; 
    int y = 100; 
    int w = 3264; 
    int h = 2448; 

    String path = "D:images\\upload_final\\030311175258.jpg"; 

    BufferedImage image = ImageIO.read(new File(path)); 
    BufferedImage out = image.getSubimage(x, y, w, h); 

    ImageIO.write(out, "jpg", new File(path)); 

} 

Pero me sigue dando el mismo error:

java.awt.image.RasterFormatException: (x + width) is outside of Raster 
sun.awt.image.ByteInterleavedRaster.createWritableChild(ByteInterleavedRaster.java:1230) 
    java.awt.image.BufferedImage.getSubimage(BufferedImage.java:1156) 

¿Dónde está mi error?

Respuesta

29

Mi conjetura inicial es que su (x + w) > image.getWidth().

Si imprime image.getWidth(), ¿es 3264? : O

Lo que está haciendo actualmente es la siguiente:

<-- 3264 ------> 
+--------------+ 
| orig  | +-- Causing the problem 
|    | V 
| +--------------+ 
|100| overlap | | 
| |   | | 
| |   | | 
+---|----------+ | 
    |    | 
    | out  | 
    +--------------+ 

Si usted está tratando de eliminar la esquina superior del orig, y acaba de obtener "solapamiento", entonces tienes que hacer

BufferedImage out = image.getSubimage(x, y, w-x, h-y); 

Si usted está tratando de hacer esto:

+------------------+ 
|     | 
| +-----------+ | 
| |   | | 
| |   | | 
| |   | | 
| |   | | 
| +-----------+ | 
|     | 
+------------------+ 

Luego hay que hacer esto:

BufferedImage out = image.getSubimage(x, y, w-2*x, h-2*y); 
+1

Hola amigo, lo es. –

+0

@Valter Respuesta actualizada para que quede más claro lo que estamos haciendo. – corsiKa

+0

muchas gracias @glowcoder funciona perfectamente soy el segundo enfoque =) –

4

Para aquellos que sólo quieren recortar y otras características básicas de manipulación de imágenes en su software me recomiendan usar una biblioteca de procesamiento de imágenes. Por lo general, las implementaciones están optimizadas y son estables.

Algunas bibliotecas de procesamiento de imágenes de Java: ImageJ, Marvin, JMagick, JIU, JH Labs, imgscalr.

Otra ventaja es mantener las cosas simples de su lado. Puedes hacer muchas cosas con solo unas pocas líneas de código. En el ejemplo siguiente, utilicé Marvin Framework para recortar.

original:
enter image description here

recortada:
enter image description here

Fuente:

MarvinImage image = MarvinImageIO.loadImage("./res/famousFace.jpg"); 
crop(image.clone(), image, 60, 32, 182, 62); 
MarvinImageIO.saveImage(image, "./res/famousFace_cropped.jpg"); 
+0

recortar es una línea de código ¿de qué estás hablando? por supuesto, tiene que promocionar su biblioteca – gpasch

+0

@gpasch Disculpe si no tuve claro mi punto. Cuando recomiendo usar una biblioteca, está relacionado con el procesamiento de imágenes en general, sin considerar simplemente recortar. Muchos desarrolladores vienen aquí buscando una solución. En lugar de copiar y pegar métodos, recomiendo usar una biblioteca. Recortar es solo una línea, pero cambiar el tamaño, la rotación, etc. es mucho más complejo de hacer usando solo la API Java predeterminada. Cité 6 marcos. Por supuesto, utilicé a Marvin en mi ejemplo, ya que es el que ayudo a desarrollar y con el que estoy más familiarizado. Si otros ven este problema como usted después de mi explicación, yo mismo borraré la respuesta. –

Cuestiones relacionadas