Dan*_*ist 2 java bufferedimage type-conversion 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)
Run Code Online (Sandbox Code Playgroud)
在代码中,错误所在的行位于构造函数中,如下所示:
// Get the pixel array from the BufferedImage
this.pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
Run Code Online (Sandbox Code Playgroud)
据我了解,BufferedImage不是类型BufferedImage.TYPE_INT_RGB或BufferedImage.TYPE_INT_ARGB.因为我在游戏的其余部分使用这些类型,我想知道是否有一种方法可以将加载的图像从它加载的类型转换为另一种类型.
在我的情况下,我想将图像类型转换为BufferedImage.TYPE_INT_ARGB.
使用所需类型创建新的缓冲图像
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();
Run Code Online (Sandbox Code Playgroud)
稍微(好吧,我承认,相当多)更详细,但在大多数情况下更快和更高效的内存方式是将图像直接加载到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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3642 次 |
| 最近记录: |