我试图得到图像的每一个像素的每一种颜色。我的想法是:
int[] pixels;
BufferedImage image;
image = ImageIO.read(this.getClass.getResources("image.png");
int[] pixels = ((DataBufferInt)image.getRaster().getDataBuffer()).getData();
字符串
是这样吗?我甚至不能检查“pixels”数组包含什么,因为我得到以下错误:
java.awt.image.DataBufferByte cannot be cast to java.awt.image.DataBufferInt
型
我只是想接收数组中每个像素的颜色,我如何实现?
6条答案
按热度按时间thigvfpy1#
字符串
当然,您必须为所有像素添加一个
for
循环。7gcisfzg2#
问题(也是从第一个答案中链接的答案)是,您几乎不知道在使用ImageIO阅读缓冲图像后,缓冲图像的确切类型是什么。它可以包含
DataBufferByte
或DataBufferInt
。在某些情况下,您可以通过BufferedImage#getType()
推断它,但在最坏的情况下,它的类型为TYPE_CUSTOM
,然后您只能退回到一些instanceof
测试。但是,您可以将图像转换为BufferedImage,它保证具有ARGB值的
DataBufferInt
-即类似于字符串
否则,您可以调用
image.getRGB(x,y)
,它可以动态执行所需的转换。顺便说一句:注意,获取BufferedImage的数据缓冲区可能会降低绘制性能,因为图像不再可以“管理”并保存在内部VRAM中。
sh7euo9m3#
字符串
假设缓冲的图像表示具有8位RGBA颜色分量的图像,该8位RGBA颜色分量被打包成整数像素,我在维基百科上搜索“RGBA颜色空间”并发现以下内容:
在字节顺序方案中,“RGBA”被理解为表示字节R,后面是字节G,后面是字节B,并且后面是字节A。此方案通常用于描述文件格式或网络协议,它们都是面向字节的。
使用简单的Bitwise和Bitshift,您可以获得每个颜色的值和像素的alpha值。
非常有趣的是RGBA的另一阶方案:
在字序方案中,“RGBA”被理解为表示完整的32位字,其中R比G更有效,G比B更有效,B比A更有效。该方案可用于描述特定系统上的存储器布局。它的含义因系统的字节序而异。
bakd9h0s4#
字符串
没有
型
试试这个:Java - get pixel array from image
s4n0splo5#
字符串
ih99xse16#
我知道这个问题已经得到了答案,但给出的答案有点复杂,需要改进。简单的想法是循环遍历图像中的每个(x,y)像素,并获得该像素的颜色。
字符串
然后,您可以将这个方法 Package 在一个类中,并实现Java的Iterable API。
型
它的用法可能类似于以下
型