5

私はコードを持っています。それは画像(または画面のセクション)の色を見つけ、RGとBの色が​​127より大きい場合、2D int配列の対応する位置に1を置きます。これが現在のセグメントですが、明らかに非常に遅いです。これを行うより良い方法はありますか?

private void traceImage(){
    try{
        Robot r = new Robot();
        b = new int[470][338];
        for(int y = 597; y < 597+469; y++)
        {
            for(int x = 570; x < 570+337; x++)
            {
                if(r.getPixelColor(x,y).getRed() > 127 &&
                   r.getPixelColor(x,y).getGreen() > 127 && 
                   r.getPixelColor(x,y).getBlue() > 127)
                {
                    b[y-597][x-570] = 1;
                }
                else
                {
                    b[y-597][x-570] = 0;
                }
            }
        }
    }
    catch(Exception ex){System.out.println(ex.toString());}
}

上記の値を使用してこれを行うには、より高速な方法が必要です。bは int 配列で、このセグメントで初期化されます。r画面上のピクセルの色を見つけるために使用するロボットです。自明xである必要があります。y

ありがとうミケラ!これは私があなたの答えに基づいて得た最終結果です:

private void traceActionPerformed(java.awt.event.ActionEvent evt) {
    try{
        Robot r = new Robot();
        BufferedImage image = r.createScreenCapture(new Rectangle(597,570,470,337));
        b = new int[image.getWidth()][image.getHeight()];
        for(int y=0;y<image.getWidth();y++){
            for(int x=0;x<image.getHeight();x++){
                if(image.getRGB(y,x)==-1){
                    b[y][x]=0;
                }
                else{
                    b[y][x]=1;                 
                }
            }
        }
        System.out.println("Done");
    }
    catch(Exception ex){System.out.println(ex.toString());}
}

if else ステートメントの -1 は、私が望んでいたように黒いピクセルの値を見つけたようです。

4

1 に答える 1

4

Robot.createScreenCapture()を使用して、サブイメージ全体を一度にキャプチャする必要があります。

次に、たとえばBufferedImage.getRGB(x、y)を使用して、サブイメージ内の個々のピクセルをはるかに高速にクエリできるようになります。

興味深いことに、特定の操作には非常に高速なビット単位の実装があります。((rgb & 0x808080) == 0x808080)

于 2012-05-19T05:32:21.697 に答える