Как обрезать некоторые области изображения в Java? - PullRequest
21 голосов
/ 04 марта 2011

Я пытаюсь сделать следующий код:

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));

}

Но продолжает выдавать мне ту же ошибку:

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)

Где моя ошибка?

Ответы [ 2 ]

33 голосов
/ 04 марта 2011

Мое первоначальное предположение, что ваш (x + w) > image.getWidth().

Если вы распечатываете image.getWidth (), это 3264? : O

То, что вы сейчас делаете, это:

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

Если вы пытаетесь обрезать верхний угол оригинала и просто получить «перекрытие», тогда вам нужно сделать

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

Если вы пытаетесь это сделать:

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

Тогда вам нужно сделать это:

BufferedImage out = image.getSubimage(x, y, w-2*x, h-2*y);
5 голосов
/ 08 декабря 2016

Для тех, кто просто хочет обрезать и другие основные функции манипулирования изображениями в вашем программном обеспечении, я рекомендую использовать библиотеку обработки изображений. Обычно реализации оптимизированы и стабильны.

Некоторые библиотеки обработки изображений Java: ImageJ , Марвин , JMagick , JIU , JH Labs , imgscalr .

Еще одно преимущество заключается в том, чтобы все было просто на вашей стороне. Вы можете сделать много всего за несколько строк кода. В приведенном ниже примере я использовал Marvin Framework для обрезки.

Оригинал:
enter image description here

Обрезанные:
enter image description here

* Источник: 1036 *

MarvinImage image = MarvinImageIO.loadImage("./res/famousFace.jpg");
crop(image.clone(), image, 60, 32, 182, 62);
MarvinImageIO.saveImage(image, "./res/famousFace_cropped.jpg");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...