Solución:
Mi suposición inicial es que tu (x + w) > image.getWidth()
.
Si imprime image.getWidth (), ¿es 3264? : O
Lo que estás haciendo actualmente es esto:
<-- 3264 ------>
+--------------+
| orig | +-- Causing the problem
| | V
| +--------------+
|100| overlap | |
| | | |
| | | |
+---|----------+ |
| |
| out |
+--------------+
Si está tratando de recortar la esquina superior de orig y simplemente obtener “superposición”, entonces debe hacer
BufferedImage out = image.getSubimage(x, y, w-x, h-y);
Si está intentando hacer esto:
+------------------+
| |
| +-----------+ |
| | | |
| | | |
| | | |
| | | |
| +-----------+ |
| |
+------------------+
Entonces necesitas hacer esto:
BufferedImage out = image.getSubimage(x, y, w-2*x, h-2*y);
Para aquellos que solo quieren recortar y otras funciones básicas de manipulación de imágenes en su software, les recomiendo 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. Puede hacer muchas cosas con solo unas pocas líneas de código. En el siguiente ejemplo, utilicé Marvin Framework para recortar.
Original:
Recortada:
Fuente:
MarvinImage image = MarvinImageIO.loadImage("./res/famousFace.jpg");
crop(image.clone(), image, 60, 32, 182, 62);
MarvinImageIO.saveImage(image, "./res/famousFace_cropped.jpg");