嗨,有人可以向我解释这段代码吗
private int[] pixels = ((DataBufferInt)image.getRaster().getDataBuffer()).getData();
据我了解,光栅只是代表一组像素。 getDataBuffer()为我提供了可编辑的缓冲区,以便实际上可以更改像素属性。我主要对.getData()和DataBufferInt强制转换感到困惑,这两件事到底是做什么的。
提前致谢。
最佳答案
假设image
是BufferedImage
,则getRaster()
将为图像提供WritableRaster
。然后,getDataBuffer()
将为您提供数据缓冲区,它是像素阵列周围的薄包装。
由于BufferedImage
的本机像素阵列可能是byte[]
,short[]
,int[]
或什至float[]
或double[]
,因此每种类型的支持阵列都存在DataBuffer
的多个子类(甚至有一个TYPE_USHORT
用于未签名的short
数据,它仍在使用short[]
。由于抽象getData()
超类中没有DataBuffer
或类似方法,因此您需要将缓冲区强制转换为适当的子类,以便能够以其本机形式访问数据。根据您的情况,这是DataBufferInt
,但是您可以使用dataBuffer.getType()
进行检查。
使用适当的数据缓冲区子类,您可以使用getData()
方法访问本机像素。现在,您可以根据需要直接修改像素。
但是,请注意,直接访问像素阵列将使图像“不受管理”,并禁用BufferedImage
的某些硬件加速。如果您经常在屏幕上绘制此图像,这可能不是问题,但可能会导致较慢的渲染速度和帧速率下降。