如何在Java中裁剪一些图像区域?

Val*_*lva 21 java crop image-processing

我正在尝试执行以下代码:

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

}
Run Code Online (Sandbox Code Playgroud)

但一直给我同样的错误:

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)
Run Code Online (Sandbox Code Playgroud)

我的错误在哪里?

cor*_*iKa 33

我最初的猜测是你的(x + w) > image.getWidth().

如果你打印出image.getWidth(),它是3264吗?:o

你目前正在做的是:

<-- 3264 ------>
+--------------+
|    orig      | +-- Causing the problem
|              | V
|   +--------------+
|100| overlap  |   |
|   |          |   |
|   |          |   |
+---|----------+   |
    |              |
    |    out       |
    +--------------+
Run Code Online (Sandbox Code Playgroud)

如果你试图修剪orig的顶角,只是得到"重叠",那么你需要这样做

BufferedImage out = image.getSubimage(x, y, w-x, h-y);
Run Code Online (Sandbox Code Playgroud)

如果你想这样做:

+------------------+
|                  |
|  +-----------+   |
|  |           |   |
|  |           |   |
|  |           |   |
|  |           |   |
|  +-----------+   |
|                  |
+------------------+
Run Code Online (Sandbox Code Playgroud)

然后你需要这样做:

BufferedImage out = image.getSubimage(x, y, w-2*x, h-2*y);
Run Code Online (Sandbox Code Playgroud)

  • @Valter没问题.Ascii art:Stack Overflow的白板.:-) (3认同)

Gab*_*njo 5

对于那些只想在您的软件上进行裁剪和其他基本图像处理功能的人,我建议使用图像处理库.通常,实现是优化和稳定的.

一些Java图像处理库:ImageJ,Marvin,JMagick,JIU,JH Labs,imgscalr.

另一个优点是让事情变得简单.只需几行代码即可完成许多工作.在下面的示例中,我使用Marvin Framework进行裁剪.

原版的:
在此输入图像描述

七分裤:
在此输入图像描述

资源:

MarvinImage image = MarvinImageIO.loadImage("./res/famousFace.jpg");
crop(image.clone(), image, 60, 32, 182, 62);
MarvinImageIO.saveImage(image, "./res/famousFace_cropped.jpg");
Run Code Online (Sandbox Code Playgroud)