【问题标题】:BufferedImage & Rasters (Java)缓冲图像和栅格 (Java)
【发布时间】:2015-06-07 20:11:21
【问题描述】:
你好,谁能给我解释一下这段代码
private int[] pixels = ((DataBufferInt)image.getRaster().getDataBuffer()).getData();
据我了解,栅格仅表示一组像素。 getDataBuffer() 为我提供了可编辑的缓冲区,以便我可以实际更改像素属性。我主要对 .getData() 和 DataBufferInt 演员感到困惑,这两件事到底是做什么的。
提前致谢。
【问题讨论】:
标签:
java
buffer
bufferedimage
raster
【解决方案1】:
假设image 是BufferedImage,getRaster() 将为您提供图片的WritableRaster。然后,getDataBuffer() 将为您提供数据缓冲区,它是像素阵列周围的薄包装。
因为BufferedImage 的原生像素数组可能是byte[]、short[]、int[] 甚至是float[] 或double[],所以DataBuffer 的多个子类存在于每种类型的后备数组(甚至还有一个TYPE_USHORT 用于未签名的short 数据,它仍在使用short[])。由于抽象DataBuffer 超类中没有getData() 或类似方法,因此您需要将缓冲区强制转换为适当的子类,以便能够以本机形式访问数据。在您的情况下这是 DataBufferInt,但您可以使用 dataBuffer.getType() 进行检查。
通过适当的数据缓冲区子类,您可以使用getData() 方法访问本机像素。您现在可以以任何您想要的方式直接修改像素。
但是,请注意,直接访问像素阵列会使您的图像“不受管理”,并禁用BufferedImage 的某些硬件加速。这可能不是问题,但如果您经常将此图像绘制到屏幕上,可能会导致渲染速度变慢和帧速率下降。