1

私は教科書に従っていますが、特定のポイントで立ち往生しています。

これはコンソール アプリケーションです。

画像回転メソッドを持つ次のクラスがあります。

public class Rotate {
    public ColorImage rotateImage(ColorImage theImage) {
        int height = theImage.getHeight();
        int width = theImage.getWidth();
        //having to create new obj instance to aid with rotation
        ColorImage rotImage = new ColorImage(height, width);
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                Color pix = theImage.getPixel(x, y);
                rotImage.setPixel(height - y - 1, x, pix);
            }
        }
        //I want this to return theImage ideally so I can keep its state
        return rotImage;
    }
}

回転は機能しますが、新しい ColorImage (以下のクラス) を作成する必要があります。これは、新しいオブジェクト インスタンス (rotImage) を作成し、渡したオブジェクト (theImage) の状態を失うことを意味します。現在、ColorImage にはあまり格納されていないため、大したことではありませんが、たとえば、適用された回転数や何かのリストの状態を格納したい場合は、それらすべてを失います。

以下のクラスは教科書からです。

public class ColorImage extends BufferedImage {
    public ColorImage(BufferedImage image) {
        super(image.getWidth(), image.getHeight(), TYPE_INT_RGB);
        int width = image.getWidth();
        int height = image.getHeight();
        for (int y = 0; y < height; y++)
            for (int x = 0; x < width; x++)
                setRGB(x, y, image.getRGB(x, y));
    }

    public ColorImage(int width, int height) {
        super(width, height, TYPE_INT_RGB);
    }

    public void setPixel(int x, int y, Color col) {
        int pixel = col.getRGB();
        setRGB(x, y, pixel);
    }

    public Color getPixel(int x, int y) {
        int pixel = getRGB(x, y);
        return new Color(pixel);
    }
}

私の質問は、渡した画像をどのように回転させて、その状態を維持できるかということです。

4

1 に答える 1

2

正方形の画像または 180 度の回転に制限しない限り、寸法が変更されているため、新しいオブジェクトが必要です。一度作成された BufferedImage オブジェクトのサイズは一定です。

たとえば、適用された回転数の状態や、すべてを失っているもののリストを格納したい場合

ColorImage/BufferedImage とともに他の情報を保持する別のクラスを作成してから、ColorImage/BufferedImage クラス自体をピクセルのみを保持するように制限できます。例:

class ImageWithInfo {
    Map<String, Object> properties; // meta information
    File file; // on-disk file that we loaded this image from
    ColorImage image; // pixels
}

次に、他の状態を維持しながら、ピクセル オブジェクトを自由に置き換えることができます。継承よりも構成を優先すると役立つことがよくあります。つまり、クラスを拡張する代わりに、元のクラスをフィールドとして含む別のクラスを作成します。

また、あなたの本からのローテーションの実装は、主に学習目的のようです。それは問題ありませんが、非常に大きな画像を操作したり、アニメーション速度で連続してグラフィックスを回転させたりすると、パフォーマンスの制限が表示されます.

于 2013-10-07T22:07:59.130 に答える