嗨,有人可以向我解释这段代码吗

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


据我了解,光栅只是代表一组像素。 getDataBuffer()为我提供了可编辑的缓冲区,以便实际上可以更改像素属性。我主要对.getData()和DataBufferInt强制转换感到困惑,这两件事到底是做什么的。

提前致谢。

最佳答案

假设imageBufferedImage,则getRaster()将为图像提供WritableRaster。然后,getDataBuffer()将为您提供数据缓冲区,它是像素阵列周围的薄包装。

由于BufferedImage的本机像素阵列可能是byte[]short[]int[]或什至float[]double[],因此每种类型的支持阵列都存在DataBuffer的多个子类(甚至有一个TYPE_USHORT用于未签名的short数据,它仍在使用short[]。由于抽象getData()超类中没有DataBuffer或类似方法,因此您需要将缓冲区强制转换为适当的子类,以便能够以其本机形式访问数据。根据您的情况,这是DataBufferInt,但是您可以使用dataBuffer.getType()进行检查。

使用适当的数据缓冲区子类,您可以使用getData()方法访问本机像素。现在,您可以根据需要直接修改像素。

但是,请注意,直接访问像素阵列将使图像“不受管理”,并禁用BufferedImage的某些硬件加速。如果您经常在屏幕上绘制此图像,这可能不是问题,但可能会导致较慢的渲染速度和帧速率下降。

10-02 03:40
查看更多