gpt4 book ai didi

java - 通过数组操作 BufferedImage 中的像素

转载 作者:行者123 更新时间:2023-12-01 13:47:00 26 4
gpt4 key购买 nike

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

我质疑的代码行是:

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

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

 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”变量的内容。从来没有一种方法可以将像素数组值复制到图像中。

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

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

在图像和上面代码中创建的数组之间创建自动链接吗?也许我要发疯了,错过了一些东西,但我已经多次检查了代码,并且“图像”变量在初始创建后没有被操纵过。 (当然,除了渲染到屏幕上。)数组“像素”总是被填充不同的值,从而导致渲染图像发生变化。

对此有一些见解会很棒。预先感谢您!

最佳答案

你为什么不打电话

image.getData()

而不是

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

image.getData() 返回光栅的副本。 getRaster() 返回一个具有修改像素能力的 WriteableRaster。我猜测,但 getRaster() 可能返回图像 Raster 的子级,因此如果修改数组,则该子级是可写的。尝试 image.getData() 看看它是否有效。如果没有,请发回此处,我会仔细查看。

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

您可以对返回的栅格调用 getPixels:

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

Returns an int array containing all samples for a rectangle of pixels, one sample per array element. An ArrayIndexOutOfBoundsException may be thrown if the coordinates are not in bounds. However, explicit bounds checking is not guaranteed.

关于java - 通过数组操作 BufferedImage 中的像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20292418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com