BufferedImage и масив от пиксели TheCherno

Така че гледах серията за разработка на 2d игри на TheChernoProject в Java и съм до епизод 9. Досега разбирам всичко в поредицата, но изглежда не мога да си обясня BufferedImage и пикселите масив.

(линк към епизод: https://www.youtube.com/watch?v=HwUnMy_pR6A)

Не разбирам как масивът от пиксели е свързан с обекта BufferedImage. Доколкото разбирам, когато стартирате програмата, вие създавате BuferredImage, наречено изображение, след което копирате данните от всеки пиксел в това изображение в масива, наречен пиксели, използвайки

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 и 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.

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

Например:

Ако разрешите достъп до поле като

форма.x = 90

тогава не можете да добавите никаква логика в бъдеще, за да потвърдите данните.

да речем, че ако x не може да бъде по-малко от 100, не можете да го направите, но ако имате сетери като

Някои други от тях са разгледани тук.

person Daniel Kvist    schedule 08.03.2015