2012-07-23 30 views
0

該程序應該採取截圖(haystack),然後在屏幕截圖中查找子圖像(針)。然後輸出針的位置。它使用for循環遍歷每個維度。它從左→右→上→下。在第36和37行中,從getSubImage()方法中引發了RasterFormatException。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)" 
+2

「是否在柵格之外」不解釋什麼? – davidbuzatto 2012-07-23 21:21:05

+0

堆棧跟蹤說'test.Test.findSpectators()',但我沒有看到它在你的代碼(或方法)中被調用。 – 2012-07-23 21:21:12

+0

@JonLin謝謝。我修好了。 – Nyx 2012-07-23 21:22:46

回答

0

你總是讓子圖像與haystack.getWidth()的寬度 - needle.getWidth()和高度haystack.getHeight()的 - needle.getHeight()
但你循環乾草堆圖像的整個寬度和高度。

說乾草堆是100x100像素,針是10x10像素。所以子圖像將是90x90像素。

在for循環期間,前10次將工作,因爲10 + 90 = 100。但第11次,你會遇到問題:11 + 90 = 101。
由於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; 
} 

}

錯誤(我沒有當場首次),是子圖像有其他兩個圖像作爲其大小的差異,而它只應該是針的大小。 請注意,使用needle == subImage將不起作用。
雖然圖像的內容可能相同,但兩個圖像對象不相等。

+0

您還需要將i和j設置爲針的高度和寬度。 – Nyx 2012-07-23 21:45:51

+0

因此,針的左側和頂部不會脫落。 – Nyx 2012-07-23 21:51:32

+0

@Marv看一看這個圖片:[鏈接](http://i48.tinypic.com/1erk2b.jpg)。在那裏我勾畫了3個代碼的搜索區域(您的,我的和我的)。綠色區域是有效的搜索區域,紅色是您將獲得例外的地方,藍色是未曾搜索過的區域。 – 2012-07-24 08:29:37