0

このプログラムは、スクリーンショット (干し草の山) を撮り、スクリーンショット内でサブイメージ (針) を探すことになっています。次に、針の位置を出力します。for ループを使用して、各次元をループします。左→右、上→下の順です。36 行目と 37 行目では、getSubImage() メソッド内から RasterFormatException がスローされます。

import java.awt.AWTException;
import java.awt.HeadlessException;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Test {
    public static void main(String[] args) throws HeadlessException, AWTException,   IOException, ClassNotFoundException {

        BufferedImage haystack = new Robot().createScreenCapture(new Rectangle(
                Toolkit.getDefaultToolkit().getScreenSize()));

        Point p = findNeedle (ImageIO.read(new File ("needle.png")));

        System.out.println(p.getX() + ", " + p.getY());
    }

    static Point findNeedle(BufferedImage needle) throws HeadlessException, AWTException {
        BufferedImage haystack = new Robot().createScreenCapture(new Rectangle(
                Toolkit.getDefaultToolkit().getScreenSize()));

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


                if (haystack.getSubimage(j, i, haystack.getWidth() - needle.getWidth(),
                        haystack.getHeight() - needle.getHeight()) == needle) {
                    return new Point(j, i);
                }
            }
        }
        return null;
    }
}

これがエラーです。

Exception in thread "main" java.awt.image.RasterFormatException: (x + width) is outside raster
    at sun.awt.image.IntegerInterleavedRaster.createWritableChild(IntegerInterleavedRaster.java:467)
    at java.awt.image.BufferedImage.getSubimage(BufferedImage.java:1173)
    at test.Test.findNeedle(Test.java:36)
    at test.Test.main(Test.java:20)"
4

1 に答える 1

0

常に haystack.getWidth() - needle.getWidth() の幅とhaystack.getHeight() - needle.getHeight()高さを持つ subImage を取得しています。
ただし、干し草の山イメージの幅と高さ全体をループします。

干し草の山が 100x100 ピクセルで、針が 10x10 ピクセルだとします。したがって、サブ画像は 90x90 ピクセルになります。

for ループの間、最初の 10 回は 10+90 = 100 として機能します。しかし、11 回目で問題が発生します: 11+90 = 101
。それは干し草の山イメージの範囲外です。

修正:

public class Test
{

public static void main(String[] args) throws HeadlessException, AWTException, IOException, ClassNotFoundException
{

    BufferedImage haystack = new Robot().createScreenCapture(new Rectangle(
            Toolkit.getDefaultToolkit().getScreenSize()));

    Point p = findNeedle(ImageIO.read(new File("needle.png")), haystack);

    System.out.println(p.getX() + ", " + p.getY());
}

static Point findNeedle(BufferedImage needle, BufferedImage haystack) throws HeadlessException, AWTException
{
    for (int i = 0; i <= haystack.getWidth() - needle.getWidth(); i++)
    {
        for (int j = 0; j <= haystack.getHeight() - needle.getHeight(); j++)
        {
            if (haystack.getSubimage(i, j, needle.getWidth(), needle.getHeight()) == needle)
            {
                return new Point(j, i);
            }
        }
    }
    return null;
}

}

エラー(最初はわかりませんでした)は、サブイメージのサイズは他の2つのイメージの違いであり、針のサイズのみである必要があるということでした。needle == subImage使えませんのでご注意ください。
画像の内容は同じかもしれませんが、2 つの画像オブジェクトは等しくありません。

于 2012-07-23T21:42:40.323 に答える