java - 坐标越界 :bufferedimage

标签 java rgb bufferedimage

我编写了一个程序来分离图像的红蓝和绿分量,但下面的代码给出了一个错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
at sun.awt.image.ByteInterleavedRaster.getDataElements(ByteInterleavedRaster.java:318)
at java.awt.image.BufferedImage.getRGB(BufferedImage.java:888)
at rgb.Rgb.main(Rgb.java:46):

这是源代码:

public static void main(String[] args) {
    String type = "jpg";
    BufferedImage img = null;
    try {
        img = ImageIO.read(new File("d:\\a.jpg"));
        System.out.println(img.getWidth() + "     " + img.getHeight());

    } catch (IOException ex) {
        Logger.getLogger(Rgb.class.getName()).log(Level.SEVERE, null, ex);

    }

    BufferedImage rp, gp, bp;

    rp = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
    bp = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
    gp = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);

    for (int i = 1; i <= img.getHeight(); i++) {
        for (int j = 1; j <= img.getWidth(); j++) {

            int pixel = img.getRGB(i, j);
            int alpha = pixel & 0xff000000;
            int red = (pixel >> 16) & 0xff;
            int green = (pixel >> 8) & 0xff;
            int blue = (pixel) & 0xff;
            rp.setRGB(i, j, alpha | (red << 16));
            gp.setRGB(i, j, alpha | (green << 8));
            bp.setRGB(i, j, alpha | blue);

        }

    }

    try {
        ImageIO.write(rp, type, new File("d:\\red.jpg"));
        ImageIO.write(gp, type, new File("d:\\green.jpg"));
        ImageIO.write(bp, type, new File("d:\\blue.jpg"));
    } catch (IOException ex) {
        Logger.getLogger(Rgb.class.getName()).log(Level.SEVERE, null, ex);
    }

最佳答案

该方法是 getRGB(x,y),这意味着您的外循环应该针对宽度,而内循环应该针对高度。改为

for (int i = 0; i < img.getWidth(); i++) {
        for (int j = 0; j < img.getHeight(); j++) {

原因
您正在尝试获取不存在的坐标。这是因为

  1. 你的循环应该从 0 开始到 getWidth()-1/getHeight()-1 结束,因为最后一个坐标是 (WIDTH-1,HEIGHT-1)
  2. 您的外循环正在获取 y 值,而内循环正在获取 x 值,因此您试图获取一个 (y,x) 值,而它应该是 (x,y) 值。如果它是方形图片,这不会导致任何问题,但如果它是矩形,则会导致异常,就像您的情况一样。

所以按照我在代码中的建议进行更改,它应该可以工作。

关于java - 坐标越界 :bufferedimage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25610291/

相关文章:

Java XMLGregorianCalendar 正在改变时间 - 奇怪的行为

java - Assertions.assertThrows 返回 void,而它必须返回 Throwable | J单元5

d3.js 将比例调整为蓝色的 rgb() 范围

language-agnostic - 给我画彩虹

java - 从 BufferedImage 获取像素数据

java - 创建一个线程来重复捕获屏幕

java - Spring Security - BytesEncryptor - 没有获得正确的加密密码

java - 需要在 MVC portlet 中包含 org.json 包以在 Liferay 7 中解析 JSON

image - rawvideo 和 rgb32 值传递给 FFmpeg

Java BufferedImage 序列化