我目前正在从头开始关注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();
在图像和上面代码中创建的数组之间创建一个自动链接?也许我正在去克服,只是错过了一些东西,但我已经多次审查了代码而不是一次是在初始创建之后操纵的“图像”变量。 (当然,除了被渲染到屏幕之外。)数组“像素”总是被填充不同的值,导致渲染图像的变化。
对此的一些见解会非常棒。提前谢谢!
答案 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()
返回原始像素数组,允许实际向其写入像素。