BufferedImage и массив пикселей TheCherno

Итак, я смотрю серию 2D-игр TheChernoProject по разработке игр на Java, и я дошел до 9-го эпизода. До сих пор я понимал все в этой серии, однако я не могу понять BufferedImage и пиксели. множество.

(ссылка на выпуск: https://www.youtube.com/watch?v=HwUnMy_pR6A)

Я не понимаю, как массив пикселей относится к объекту BufferedImage. Насколько я понимаю, когда вы запускаете программу, вы создаете BuferredImage с именем image, затем вы копируете данные из каждого пикселя этого изображения в массив, называемый пикселями, используя

public int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();

Но ни в коем случае вы не помещаете данные из пикселей обратно в это изображение, так как же

g.drawImage(image, 0, 0, getWidth(), getHeight(), null);

вывести данные из массива пикселей на экран? Я ожидаю, что он просто нарисует черное изображение.


person Phil Macrackin    schedule 10.01.2015    source источник


Ответы (2)


Ваш getData() возвращает ссылку на фактический int[], поэтому таким образом, когда вы меняете его элементы, вы изменяете элементы массива фактический.

Ссылка: Filthy Rich Clients, Developing Animated and Graphical Effects for Desktop Java(TM), Addison-Wesley, Chet Haase and Romain Guy, BufferedImage, стр. 95.

person fscherrer    schedule 10.01.2015

Большинство геттеров, включая метод getData() в классе DataBufferInt, возвращают ссылку на объект, что означает, что при редактировании объекта, возвращаемого геттером, вы редактируете объект, на который указывает ссылка, возвращаемая геттером.

В этом случае при вызове метода getData() ссылка указывает на массив пикселей, который создает фактическое изображение.

Давайте используем этот код в качестве простого примера:

public class MyClass1
{
    public static int myObject = new MyClass2(278);

    public static MyClass2 getMyObject()
    {
        return myObject;
    }

    class MyClass2
    {
        private int myInt;

        public MyClass2(int myInt)
        {
            this.myInt = myInt;
        }

        public void setMyInt(int newMyInt)
        {
            myInt = newMyInt;
        }
    }
}

Затем этот вызов:

MyClass1.myObject.setMyInt(523);

эквивалентен этому вызову:

MyClass.getMyObject().setMyInt(523);

потому что MyClass1.getMyObject() возвращает ссылку на myObject вместо того, чтобы напрямую обращаться к myObject с помощью MyClass1.myObject.

Геттеры полезны по многим причинам.

Например:

Если вы разрешаете доступ к полю, например

форма.х = 90

тогда вы не сможете добавить какую-либо логику в будущем для проверки данных.

скажем, если x не может быть меньше 100, вы не можете этого сделать, однако, если у вас есть такие сеттеры, как

Еще несколько из них рассматриваются здесь.

person Daniel Kvist    schedule 08.03.2015