Как обрезать некоторый регион изображения на 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));
}
Но продолжает давать мне ту же ошибку:
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)
Где моя ошибка?
Ответы
Ответ 1
Я предполагаю, что ваш (x + w) > image.getWidth()
.
Если вы распечатываете image.getWidth(), это 3264?: О
То, что вы сейчас делаете, это:
<-- 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);
Ответ 2
Для тех, кто просто хочет обрезать и другие основные функции манипулирования изображениями в вашем программном обеспечении, я рекомендую использовать библиотеку обработки изображений. Обычно реализации оптимизированы и стабильны.
Некоторые библиотеки обработки изображений Java: ImageJ, Марвин, JMagick, JIU, JH Labs, imgscalr.
Еще одним преимуществом является простота на вашей стороне. Вы можете сделать много всего за несколько строк кода. В приведенном ниже примере я использовал Marvin Framework для обрезки.
Оригинал:
![enter image description here]()
Обрезанные:
![enter image description here]()
Источник:
MarvinImage image = MarvinImageIO.loadImage("./res/famousFace.jpg");
crop(image.clone(), image, 60, 32, 182, 62);
MarvinImageIO.saveImage(image, "./res/famousFace_cropped.jpg");
Ответ 3
Есть ли способ сделать ту же обрезку, но без каких-либо библиотек? Самостоятельная функция может быть?