Comment recadrer une région d'image en Java?

je suis en train de faire le code suivant:

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

    String path = "D:imagesupload_final30311175258.jpg";

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

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

}

Mais garde me donne le même message d'erreur:

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)

Où est mon erreur ?

20
demandé sur Jaumzera 2011-03-04 00:11:04

2 réponses

mon hypothèse initiale est que votre (x + w) > image.getWidth().

Si vous imprimez l'image.getWidth(), est-il 3264? : O

Ce que vous êtes en train de faire est ceci:

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

Si vous essayez de couper le coin supérieur de orig, et juste se "chevauchent", alors vous devez faire

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

Si vous essayez de faire ceci:

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

Ensuite, vous devez faire ceci:

BufferedImage out = image.getSubimage(x, y, w-2*x, h-2*y);
32
répondu corsiKa 2011-03-03 21:21:51

pour ceux qui veulent simplement couper et autres fonctionnalités de manipulation d'image de base sur votre logiciel, je recommande d'utiliser une bibliothèque de traitement d'image. Habituellement, les implémentations sont optimisées et stables.

Certaines Java bibliothèques de traitement d'images: ImageJ, Marvin, JMagick, JIU, JH Labs, imgscalr.

un Autre avantage est de garder les choses simples de votre côté. Vous pouvez faire beaucoup des choses avec seulement quelques lignes de code. Dans l'exemple ci-dessous, j'ai utilisé Marvin Framework pour le recadrage.

Origine:

enter image description here

recadré:

enter image description here

Source:

MarvinImage image = MarvinImageIO.loadImage("./res/famousFace.jpg");
crop(image.clone(), image, 60, 32, 182, 62);
MarvinImageIO.saveImage(image, "./res/famousFace_cropped.jpg");
5
répondu Gabriel Ambrósio Archanjo 2016-12-08 13:21:42