Estoy tratando de hacer el siguiente código:

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)

Donde está mi error ?

InformationsquelleAutor Valter Silva | 2011-03-03

2 Comentarios

  1. 33

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

    Si la impresión de la imagen.getWidth(), es 3264? :O

    Lo que estás haciendo ahora es este:

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

    Si usted está tratando de recortar la esquina superior de orig, y acaba de obtener el «solapamiento» entonces usted necesita para hacer

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

    Si usted está tratando de hacer esto:

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

    Entonces usted necesita para hacer esto:

    BufferedImage out = image.getSubimage(x, y, w-2*x, h-2*y);
    • Hola amigo, lo es.
    • Respuesta actualizada para que sea más claro lo que estamos haciendo.
    • muchas gracias @glowcoder funciona a la perfección, estoy en el segundo enfoque =)
    • no hay problema. Arte Ascii: la pizarra de Desbordamiento de Pila. 🙂
  2. 5

    Para aquellos que sólo quieren recortar y otros básicas de manipulación de la imagen de las características de su software recomiendo el uso de una biblioteca de procesamiento de imagen. Generalmente las implementaciones optimizadas y estable.

    Algunos de Java de procesamiento de imagen de las bibliotecas: ImageJ, Marvin, JMagick, JIU, JH Laboratorios, imgscalr.

    Otra ventaja es mantener las cosas simples en su lado. Usted puede hacer un montón de cosas con sólo unas pocas líneas de código. En el siguiente ejemplo, he utilizado Marvin Marco para el cultivo.

    Original:

    Cómo recortar una región de la imagen en Java?

    Recortada:

    Cómo recortar una región de la imagen en Java?

    Fuente:

    MarvinImage image = MarvinImageIO.loadImage("./res/famousFace.jpg");
    crop(image.clone(), image, 60, 32, 182, 62);
    MarvinImageIO.saveImage(image, "./res/famousFace_cropped.jpg");
    • el cultivo es una línea de código ¿de qué estás hablando?? por supuesto, usted tiene que promocionar su biblioteca
    • Lo siento Si no fui claro acerca de mi punto. Cuando recomiendo el uso de una biblioteca está relacionado con el procesamiento de la imagen en general, no considerando sólo el recorte. Muchos desarrolladores vienen aquí buscando una solución. En lugar de copiar y pegar métodos, recomiendo el uso de una biblioteca. El cultivo es sólo una línea, pero el cambio de tamaño, rotación, etc es mucho más complejo para hacer uso solo de forma predeterminada API de Java. He citado 6 marcos. Por supuesto he utilizado Marvin en mi ejemplo, ya que es el que me ayuda a desarrollar y estoy más familiarizado. Si los demás ven este problema como después de mi explicación me voy a borrar la respuesta a mí mismo.
    • Personalmente me encanta la respuesta (aunque tengo la marca!) He de decir que si usted ayudó a desarrollar el marco declinamos que en la respuesta. =) meta.stackexchange.com/a/59302/147335

Dejar respuesta

Please enter your comment!
Please enter your name here