2013-10-07 4 views
1

Я следую учебнику и застрял в определенной точке.Повернуть BufferedImage

Это консольное приложение.

У меня есть следующий класс с методом циклического сдвига изображения:

public class Rotate { 
    public ColorImage rotateImage(ColorImage theImage) { 
     int height = theImage.getHeight(); 
     int width = theImage.getWidth(); 
     ColorImage rotImage = new ColorImage(height, width); //having to create new obj instance to aid with rotation 
     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); 
      } 
     } 
     return rotImage; //I want this to return theImage ideally so I can keep its state 
    } 
} 

вращение работает, но я должен создать новый 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); 
    } 
} 

Вопрос, как я могу повернуть изображение, которое я передаю, чтобы сохранить его состояние?

+0

Вы действительно не можете без обертывания его в объект, как вы делаете или изобретаете свой собственный образ, или делаете что-то похожее на стенографию и скрываете информацию о состоянии в уже используемых форматах. – arynaq

+0

@arynaq Я думаю, вы имеете в виду «стеганографию». – EJP

+0

@EJP Я определенно делаю: D – arynaq

ответ

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 
} 

Затем вы можете бесплатно заменить объект пикселей, сохранив другое состояние. Это часто полезно для favor composition over inheritance. Вкратце это означает, что вместо расширения класса создайте отдельный класс, который содержит исходный класс в качестве поля.

Также обратите внимание, что реализация вращения из вашей книги, по-видимому, в основном предназначена для обучения. Это хорошо для этого, но покажет свои ограничения производительности, если вы манипулируете очень большими изображениями или для непрерывного вращения графики при скорости анимации.

+0

Да, это, по-видимому, единственный способ. Я особенно ценю дополнительную информацию: «Размеры объекта BufferedImage, когда они созданы, являются постоянными». это действительно многое выясняет. – TEK

Смежные вопросы