如何更改从文件加载的BufferedImage的图像类型?

时间:2014-12-13 09:45:34

标签: java type-conversion bufferedimage javax.imageio

我试图访问使用BufferedImage从文件加载的ImageIO.read(filePath)中的像素,但我得到此错误

Exception in thread "Game" java.lang.ClassCastException: java.awt.image.DataBufferByte cannot be cast to java.awt.image.DataBufferInt
    at com.package.graphics.Texture.<init>(Texture.java:29)
    at com.package.graphics.Texture.loadTexture(Texture.java:40)
    at com.package.Game.run(Game.java:71)
    at java.lang.Thread.run(Unknown Source)

在代码中,错误所在的行位于构造函数中,如下所示:

// Get the pixel array from the BufferedImage
this.pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();

据我了解,BufferedImage不属于BufferedImage.TYPE_INT_RGBBufferedImage.TYPE_INT_ARGB类型。因为我在游戏的其他部分使用这些类型,我想知道是否有办法转换&#39;加载的图像从它加载的类型到另一个 就我而言,我想将图像类型转换为BufferedImage.TYPE_INT_ARGB

3 个答案:

答案 0 :(得分:5)

使用您想要的类型

创建一个新的缓冲图像
BufferedImage in = ImageIO.read(img);
BufferedImage newImage = new BufferedImage(in.getWidth(), in.getHeight(), BufferedImage.TYPE_INT_ARGB);

Graphics2D g = newImage.createGraphics();
g.drawImage(in, 0, 0, in.getWidth(), in.getHeight(), null);
g.dispose();

答案 1 :(得分:5)

稍微(好吧,我承认,相当多)更详细,但在大多数情况下更快,更有效的内存方式,就是将图像直接加载到TYPE_INT_ARGB图像中。

如果您的图片很大,那么在首次加载到byte类型时,您可以通过这种方式获得相当多的好处。如果您的图片很小,可能不值得额外的代码复杂性,因为您几乎没有注意到差异。

无论如何,你可以这样做:

// Create input stream
ImageInputStream input = ImageIO.createImageInputStream(file);

try {
    // Get the reader
    Iterator<ImageReader> readers = ImageIO.getImageReaders(input);

    if (!readers.hasNext()) {
        throw new IllegalArgumentException("No reader for: " + file); // Or simply return null
    }

    ImageReader reader = readers.next();

    try {
        // Set input
        reader.setInput(input);

        // Configure the param to use the destination type you want
        ImageReadParam param = reader.getDefaultReadParam();
        param.setDestinationType(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_ARGB));

        // Finally read the image, using settings from param
        BufferedImage image = reader.read(0, param);
    }
    finally {
        // Dispose reader in finally block to avoid memory leaks
        reader.dispose();
    }
}
finally {
    // Close stream in finally block to avoid resource leaks
    input.close();
}

答案 2 :(得分:0)

您告诉JVM image.getRaster().getDataBuffer()在实际返回DataBufferByte时返回DataBufferInt。这是一个ClassCastException。您需要将返回值强制转换为正确的类型。

// Get the pixel array from the BufferedImage
this.pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();