我想将RGB值存储在像素数组中,如下所示:
pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
其中image
是:
BufferedImage image = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB);
我使用ImageIO
读取文件并且读取正常,这是问题所在。这是错误:
Exception in thread "main" java.lang.ClassCastException: java.awt.image.DataBufferByte cannot be cast to java.awt.image.DataBufferInt
at SpritePractice.render(SpritePractice.java:114)
at SpritePractice.run(SpritePractice.java:75)
at SpritePractice.start(SpritePractice.java:124)
at SpritePractice.main(SpritePractice.java:132)
像素是一个像这样的int数组:int[] pixels
我该怎么办?作为一个附带问题,有人可以解释铸造及其作用吗?谢谢!
编辑:
在控制台上打印image.getRaster().getDataBuffer()
Heres输出:
java.awt.image.DataBufferByte@716925b0
显然这里出了点问题。我指定BufferedImage image = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB);
并且正在阅读DataBufferByte
...
答案 0 :(得分:1)
你可能做错了。 : - )
BufferedImage image = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB);
...应创建一个带有IntegerInterleavedRaster
和DataBufferInt
的图像(它在OS X上为我使用我使用的所有已安装的Java 6和7 JRE)。尝试在创建后立即打印栅格和数据缓冲区 。我相信它会打印出您最初的预期。
下面的推测性答案:
您尚未发布代码的相关部分,但我会根据您的评论猜测a)创建空图像并将其分配给image
,然后b)使用ImageIO读取其他图像并将结果分配给image
,替换之前的image
值。该图像现在具有byte类型的栅格和数据缓冲区。然后你尝试转换为int类型,然后繁荣。
现在,可以将ImageIO
读入预先创建的BufferedImage
,或者只指定类型。但这是插件和源特定的(即:不能保证它将支持TYPE_INT_RGB
)。要查询读者支持的图像布局,请执行以下操作:
ImageInputStream stream = ...;
Iterator<ImageReader> readers = ImageIO.getImageReaders(stream);
if (readers.hasNext()) {
ImageReader reader = readers.next();
try {
reader.setInput(stream);
ImageReadParam param = reader.getDefaultReadParam();
Iterator<ImageTypeSpecifier> specs = reader.getImageTypes();
while (specs.hasNext()) {
ImageTypeSpecifier spec = specs.next();
if (/*spec is for TYPE_INT_RGB*/) {
// Either pass your pre-allocated image:
reader.setDestination(image);
// *OR* simply tell the reader what type you like the result to be:
reader.setDestinationType(spec);
}
}
// TODO: Handle the case where there's no match among the ImageTypeSpecifiers
// In case image was passed, it will be the same image returned here
image = reader.read(0, param);
}
finally {
reader.dispose();
}
}
Casting会做它一直以来所做的事情,但我不认为这是你的问题。 ; - )
答案 1 :(得分:0)
这不是很难理解:
DataBufferByte
和DataBufferInt
都扩展DataBuffer
,因此它们基本上位于类层次结构的不同分支上。
这就像尝试将相同接口的不同实现相互转换一样。
答案 2 :(得分:0)
image.getRaster().getDataBuffer()).getData();
的类型为java.awt.image.DataBufferByte
。
您正在尝试转换,即将java.awt.image.DataBufferByte
转换为java.awt.image.DataBufferInt
,而不是位于同一继承层次结构中。
记住这一点,
You can cast a sub type to super type (Liskov Substitution Principle).
When casting a super type to sub type a `ClassCasteException` will be thrown.
Also, if you attempt to cast classes which do not lie in the same inheritance
hierarchy will always throw `ClassCasteException` at runtime.