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 回答