【问题标题】:How crop some region of image in Java?如何在 Java 中裁剪图像的某些区域?
【发布时间】:2011-07-08 09:07:33
【问题描述】:

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

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)

我的错误在哪里?

【问题讨论】:

    标签: java image-processing crop


    【解决方案1】:

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

    一些Java图像处理库:ImageJMarvinJMagickJIUJH Labsimgscalr

    另一个优点是让事情变得简单。你可以用几行代码做很多事情。在下面的示例中,我使用Marvin Framework 进行裁剪。

    原文:

    裁剪:

    来源:

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

    【讨论】:

    • 裁剪是一行代码你在说什么??当然,您必须宣传您的图书馆
    • @gpasch 对不起,如果我不清楚我的观点。当我推荐使用库时,通常与图像处理有关,而不是仅仅考虑裁剪。许多开发人员来这里寻找解决方案。我建议使用库,而不是复制和粘贴方法。裁剪只是一行,但仅使用默认 Java API 来调整大小、旋转等要复杂得多。我引用了 6 个框架。当然,我在我的示例中使用了 Marvin,因为它是我帮助开发并且我更熟悉的那个。如果其他人在我的解释后看到你这样的问题,我会自己删除答案。
    • @GabrielAmbrósioArchanjo 就我个人而言,我喜欢这个答案(即使我有复选标记!)我会说,如果你帮助开发了这个框架,你会在答案中否认这一点。 =) meta.stackexchange.com/a/59302/147335
    【解决方案2】:

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

    如果打印出image.getWidth(),是不是3264? :O

    你目前正在做的是:

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

    如果你想修剪 orig 的顶角,只是得到“重叠”,那么你需要这样做

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

    如果您尝试这样做:

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

    那么你需要这样做:

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

    【讨论】:

    • @Valter 更新了答案,让我们更清楚我们在做什么。
    • 非常感谢@glowcoder 完美运行,我是第二种方法 =)
    • @Valter 没问题。 Ascii 艺术:Stack Overflow 的白板。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2016-08-13
    相关资源
    最近更新 更多