2

BufferedImage.getRGBメソッドを 7 つのパラメーターで使用して、ピクセルの領域を読み取り、その色を取得しようとしています。簡単に聞こえますが、何らかの理由でうまくいきません。以下は、短い自己完結型のコンパイル可能な例です。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class BufferedImageTest extends JPanel {
BufferedImage image;

public static void main(String[] args) {
    BufferedImageTest mainClass = new BufferedImageTest();
    mainClass.run();
}

private void run() {
    initWindow();
    // Create image:
    image = new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB);
    int[] red = new int[25];
    for (int i = 0; i < 25; i++)
        red[i] = Color.RED.getRGB();
    image.setRGB(1, 0, 3, 5, red, 0, 0);

    // Read image:
    int[] rgbArray = new int[25];
    int w = image.getWidth();
    int h = image.getHeight();
    image.getRGB(0, 0, w, h, rgbArray, 0, 0);
    for (int i = 0; i < rgbArray.length; i++) {
        Color c = new Color(rgbArray[i]);
        System.out.print("(" + c.getRed() + "," + c.getGreen() + "," + c.getBlue() + ")");
        if (i % 5 == 4)
            System.out.println("");
    }
}

@Override
public void paint(Graphics g) {
    g.drawImage(image, 5, 5, null);
}

private void initWindow() {
    JFrame frame = new JFrame();
    frame.getContentPane().add(this);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(40, 60);
    frame.setVisible(true);
}
}

run()メソッドでは、最初に次のような非常に単純な 5 x 5 ピクセルの画像を作成します。

サンプル画像

それはうまくいきます。次に、その画像のピクセルを読み取ろうとしましたが、ほとんど機能しません。ピクセルの最初の行のみを正しく取得し、残りを黒として表示します。印刷ループの出力は次のとおりです。

(0,0,0)(255,0,0)(255,0,0)(255,0,0)(0,0,0)
(0,0,0)(0,0,0)(0,0,0)(0,0,0)(0,0,0)
(0,0,0)(0,0,0)(0,0,0)(0,0,0)(0,0,0)
(0,0,0)(0,0,0)(0,0,0)(0,0,0)(0,0,0)
(0,0,0)(0,0,0)(0,0,0)(0,0,0)(0,0,0)

最初の行と完全に同じだと思うとき。ここで何が欠けていますか?私はそれを最初から書き直し、 getRGB呼び出しで「スキャンライン」および「オフセット」パラメーターをいじってみましたが、何も機能していないようです。違いがある場合は、Windows 7 で Java 7 を実行しています。

4

1 に答える 1