1

Javaで持っているピックスマップを垂直にミラーリングしようとしています。ここに私のコードがあります:

Dimension coords = pixmap.getSize();
for (int x = 0; x < coords.width; x++) {
    for (int y = 0; y < coords.height; y++) {
        Color newest = pixmap.getColor(-x, y);
        pixmap.setColor(x, y, 
            new Color(newest.getRed(),
                      newest.getGreen(),
                      newest.getBlue()));
    }
}

「pixmap」はこのインスタンス メソッドのパラメーターであり、基本的に読み込まれる画像です。画像を反転しようとしたときに発生する実行時エラーは次のとおりです。

スレッド「AWT-EventQueue-0」での例外 java.lang.ArrayIndexOutOfBoundsException: 座標が範囲外です!

任意のヒント?ありがとう!

**編集**

コードを次のように変更しました。

Dimension coords = pixmap.getSize();
for (int x = 0; x < coords.width; x++) {
    for (int y = 0; y < coords.height; y++) {
        Color newest = pixmap.getColor(x, y);
        if (x < coords.width / 2) {
            pixmap.setColor(((((coords.width/2) - x) * 2) + x), y, 
            new Color(newest.getRed(),
                      newest.getGreen(),
                      newest.getBlue()));
        } else {
        pixmap.setColor((x - (((x - (coords.width/2)) * 2))), y, 
            new Color(newest.getRed(),
                      newest.getGreen(),
                      newest.getBlue()));
        }
    }
}

そして、私はまだ同じ範囲外の例外を取得しています。このコードのどこで間違ったのかわかりません ^

4

2 に答える 2

1

Java は配列の範囲外の例外を与えています。指定された配列サイズ内に存在しないピクセルにアクセスしようとしています。

カラー newest = pixmap.getColor(-x, y);

これがおそらく問題です。
ピックスマップは 2 次元配列です。私はクラスに慣れていませんが、おそらく次のようになります。

//or whatever your screen is
int pixels[900][900];

そうは言っても、あなたのコードは配列の負の x 値座標にアクセスしようとしています。

編集:

Dimension coords = pixmap.getSize();
for (int x = 0; x < coords.width; x++) {
for (int y = 0; y < coords.height; y++) {
    pixmap.setColor(x, y, 
        new Color(newest.getRed(),
                  newest.getGreen(),
                  newest.getBlue()));
}
   }

このコードが画像を描画すると仮定するので、

Dimension coords = pixmap.getSize();
for (int x = 0; x < coords.width; x++) {
for (int y = 0; y < coords.height; y++) {
    pixmap.setColor(coords.width-x, y, 
        new Color(newest.getRed(),
                  newest.getGreen(),
                  newest.getBlue()));
}
   }

x 軸で反転した画像を描画する必要があります。あなたはおそらくここから残りを理解することができます

于 2015-12-03T04:52:17.973 に答える
1

別の解決策は、反転を行うために負の垂直スケールで Graphics2D を使用することです... これは、画像を中央に戻すために変換 (0, -height) と組み合わせて行う必要があることに注意してください。

public static void main(String[] args) throws IOException {
    BufferedImage image = ImageIO.read(new File("test.jpg"));

    BufferedImage mirrored = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);

    Graphics2D graphics = (Graphics2D)mirrored.getGraphics();
    AffineTransform transform = new AffineTransform();
    transform.setToScale(1, -1);
    transform.translate(0, -image.getHeight());
    graphics.setTransform(transform);
    graphics.drawImage(image, 0, 0, null);

    ImageIO.write(mirrored, "jpg", new File("test-flipped.jpg"));
}
于 2015-12-03T05:32:54.373 に答える