【问题标题】:BufferedImage is automatically updated when int-array representing its raster is updated当表示其栅格的 int-array 更新时,BufferedImage 会自动更新
【发布时间】:2013-11-12 22:06:32
【问题描述】:

我正在学习一个教程来扩展我的知识,但是导师有时会认为有些事情不需要解释。

看看这段代码:

private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();

someMethod() {
  for (int i=0; i<pixels.length; i++) {
    pixels[i] = i;
  }
  g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
}

我在 Canvas 上作画,令我大吃一惊的是,这会画出从黑色到蓝色的颜色。我想知道如何访问/修改红色和绿色的颜色(因为“像素”是单个整数的数组)。如果我将 RGB 替换为 BGR,则此颜色将变为红色。但这是一个旁注。 编辑:使用位移运算符&lt;&lt; and | 绘制绿色和红色。例如:int greenColor = 255&lt;&lt;16; 或 int greenAndRed = 255&lt;&lt;16 | 255&lt;&lt;8; EDIT-END

这里的一个主要难题是为什么要绘制任何东西。为像素数组赋值如何更新图像? (我根本不理解字段声明。数组启动的目的是什么)。但我对 Java 的了解告诉我这无关紧要。它是一个普通的 int 数组,带有普通的 int。谁能告诉我这是怎么回事?

编辑 问题已解决。实际上,图像数据发生变化并不奇怪,因为数组不像其他简单数据类型那样不可变。

【问题讨论】:

  • system.out.println 确实返回 true,如果您将像素 [1] 更改为像素 [1]
  • @arynaq 哦,是的,对不起。那是一个错字。这个问题是基于我的一个谬误。我可以发誓数组是不可变的。我将删除 OP 的那部分。

标签: java raster


【解决方案1】:

栅格是图像的支持数据模型。您在此处获得的int[] pixels 是对该支持数据的引用。更改像素数组中的值实际上是更改支持数据的值,在图像中立即可见。

【讨论】:

  • 好吧,当您更改数组时,它可能不会立即可见 - 但只要您绘制图像,就可以。
  • 我有点害怕答案会是这样。因为我唯一能再说一遍的是:“为什么?”。这违背了我对 Java 中变量的理解。数组和图像之间是如何建立联系的?
  • 我在处理 Swing.Jtable 时使用过数据模型,令我惊讶的是,每当我更改应用程序中的值时,模型会自动调用其“valueAt”方法进行更新桌子”。但我从来没有告诉这张图片必须用“像素”来绘制。
  • 连接不是由我们建立的,它已经通过数据模型存在,我们只是创建对该模型的引用并更改一些值,栅格决定它如何实现像素的 int[] .
  • 不同之处在于,在 Swing(和大多数其他 UI 工具包)中,视图不直接包含数据,因此需要引发某种事件来更新视图。再说一次,也许它并没有太大不同:您仍在调用 drawImage 以更新显示,这不是对事件的反应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
相关资源
最近更新 更多