BufferedImage和像素阵列TheCherno

时间:2015-01-10 18:02:39

标签: java bufferedimage pixels

所以我一直在用Java看过TheChernoProject的2D游戏开发系列,我已经到了第9集了。到目前为止,我已经理解了系列中的所有内容,但是我似乎无法绕过BufferedImage和像素数组。

(链接到剧集:https://www.youtube.com/watch?v=HwUnMy_pR6A

我不明白像素数组与BufferedImage对象的关系。根据我的理解,当你启动程序时,你创建一个名为image的BuferredImage,然后使用

将该图像中每个像素的数据复制到一个名为像素的数组中。
public int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();

但是你没有把像素中的数据放回到那个图像中,所以

是怎样的
g.drawImage(image, 0, 0, getWidth(), getHeight(), null);

将像素数组中的数据绘制到屏幕上?我希望它只会画一个黑色的图像。

2 个答案:

答案 0 :(得分:0)

您的getData()会向实际 int[]返回参考,因此,当您更改其元素时,您正在更改实际数组元素。

参考:肮脏的富客户端,为Desktop Java(TM)开发动画和图形效果,Addison-Wesley,作者:Chet Haase和Romain Guy, BufferedImage,第95页

答案 1 :(得分:0)

大多数getter,包括getData()类中的DataBufferInt - 方法,返回对Object的引用,这意味着在编辑getter返回的对象时,编辑引用的对象由吸气者返回指向。

在这种情况下,当调用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

由于种种原因,吸气剂很有用。

例如:

  

如果允许像

这样的字段访问      

shape.x = 90

     

然后您将来无法添加任何逻辑来验证数据。

     

如果x不能小于100你就不能这样做,但是如果你有的话   像

这样的二传手

其中一些问题得到解决here