【问题标题】:BufferedImage and pixels array TheChernoBufferedImage 和像素数组 TheCherno
【发布时间】:2015-01-10 18:02:38
【问题描述】:

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

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

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

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

但您绝不会将像素中的数据放回该图像中,那么如何

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

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

【问题讨论】:

    标签: java bufferedimage pixels


    【解决方案1】:

    您的 getData() 返回 referenceactual int[],因此,这样,当您更改其元素时,您将更改 actual 数组元素。

    参考:Filthy Rich Clients, Developing Animated and Graphical Effects for Desktop Java(TM),Addison-Wesley,Chet Haase 和 Romain Guy,BufferedImage,第 95 页 .

    【讨论】:

      【解决方案2】:

      大多数getter,包括DataBufferInt类中的getData()方法,都返回一个对象的引用,这意味着在编辑getter返回的对象时,你编辑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 的引用,而不是直接用MyClass1.myObject 寻址myObject

      Getter 之所以有用有很多原因。

      例如:

      如果您允许像这样的字段访问

      shape.x = 90

      那么您以后不能添加任何逻辑来验证数据。

      说如果 x 不能小于 100 你不能这样做,但是如果你有 二传手像

      其中一些是here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-16
        • 2013-07-16
        • 1970-01-01
        • 1970-01-01
        • 2013-11-06
        • 2012-03-12
        • 1970-01-01
        相关资源
        最近更新 更多