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