DataBufferByte无法强制转换为DataBufferInt?

时间:2013-11-16 19:14:26

标签: java sprite bufferedimage

我想将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 ...

3 个答案:

答案 0 :(得分:1)

你可能做错了。 : - )

BufferedImage image = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB);

...应创建一个带有IntegerInterleavedRasterDataBufferInt的图像(它在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)

这不是很难理解:

DataBufferByteDataBufferInt都扩展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.