通过Array操作BufferedImage中的像素

时间:2013-11-29 19:41:11

标签: java image graphics render pixels

我目前正在从头开始关注Java游戏开发系列。我理解大多数java和oop概念,但在处理图形和硬件加速时经验很少。

我质疑的代码行是:

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

BufferedImage“image”变量始终是通过render方法绘制到屏幕的变量。通常类似于:

 public void render() {
    BufferStrategy bs = this.getBufferStrategy;
    if(bs == null) { this.createBufferStrategy(3); return; }
    Graphics g = bs.getDrawGraphics();
    g.drawImage(image, 0, 0, WIDTH, HEIGHT, null);
    g.dispose();
    bs.show();
 }

我理解像素数组包含BufferedImage中的每个像素,但是,似乎每次数组都填充了值,它就会直接影响“image”变量的内容。从来没有一种方法可以将像素数组值复制到图像中。

这些varibales实际上是以这种方式链接的吗?是否使用:

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

在图像和上面代码中创建的数组之间创建一个自动链接?也许我正在去克服,只是错过了一些东西,但我已经多次审查了代码而不是一次是在初始创建之后操纵的“图像”变量。 (当然,除了被渲染到屏幕之外。)数组“像素”总是被填充不同的值,导致渲染图像的变化。

对此的一些见解会非常棒。提前谢谢!

2 个答案:

答案 0 :(得分:1)

你为什么不打电话

image.getData()

而不是

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

image.getData()返回Raster的副本。 getRaster()返回一个能够修改像素的WriteableRaster。我猜,但getRaster()可能会返回图像Raster的子项,因此如果修改数组则可写。尝试使用image.getData()来查看它是否有效。如果没有,请回到这里,我会仔细看看。

我进一步研究了这个。 JDK附带的源代码显示image.getRaster().getDataBuffer().getData()返回源数据数组。 image.getData()确实返回一个副本。如果修改了图像,则不会修改getData()中的数据。

您可以在返回的Raster上调用getPixels:

public int[] getPixels(int x,
              int y,
              int w,
              int h,
              int[] iArray)
  

返回一个int数组,其中包含像素矩形的所有样本,   每个数组元素一个样本。可能是ArrayIndexOutOfBoundsException   如果坐标不在边界内则抛出。但是,明确的界限   检查无法保证。

答案 1 :(得分:0)

使用int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();代替image.getData()image.getData()只返回图像数据的副本,其中image.getRaster()返回原始像素数组,允许实际向其写入像素。