java.awt.image.DataBufferByte无法强制转换为java.awt.image.DataBufferInt

我在使用JAVA进行编码时遇到了一些错误,我一直试图解决这个问题,同时也试图找到有相同问题的oterh ppl并修复它但没有任何工作……

嗯..这是代码

package ca.vanzeben.game; import java.awt.BorderLayout; import java.awt.Canvas; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.image.BufferStrategy; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; import javax.swing.JFrame; public class Game extends Canvas implements Runnable { private static final long serialVerisionUID = 1L; public static final int WIDTH = 160; public static final int HEIGHT = WIDTH / 12*9; public static final int SCALE = 3; public static final String NAME = "Game"; public boolean running = false; public int tickCount = 0; private JFrame frame; private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_3BYTE_BGR); private int[] pixels = ((DataBufferInt)image.getRaster().getDataBuffer()).getData(); public Game(){ setMinimumSize(new Dimension(WIDTH*SCALE, HEIGHT * SCALE)); setMaximumSize(new Dimension(WIDTH*SCALE, HEIGHT * SCALE)); setPreferredSize(new Dimension(WIDTH*SCALE, HEIGHT * SCALE)); frame = new JFrame(NAME); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(this, BorderLayout.CENTER); frame.pack(); frame.setResizable(false); frame.setLocationRelativeTo(null); frame.setVisible(true); } public synchronized void start() { running = true; new Thread(this).start(); } public synchronized void stop() { running = false; } public void run(){ long lastTime = System.nanoTime(); double nsPerTick = 1000000000D/60D; int ticks = 0; int frames = 0; long lastTimer = System.currentTimeMillis(); double delta = 0; while(running){ long now = System.nanoTime(); delta +=(now - lastTime) / nsPerTick; lastTime = now; boolean shouldRender = true; while(delta >= 1){ ticks++; tick(); delta -= 1; shouldRender = true; } try { Thread.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } if (shouldRender){ frames++; render(); } if(System.currentTimeMillis() - lastTimer >= 1000){ lastTimer += 1000; System.out.println(ticks + " ticks, " + frames + " frames"); frames = 0; ticks = 0; } } } public void tick() { tickCount++; } public void render(){ BufferStrategy bs = getBufferStrategy(); if(bs == null) { createBufferStrategy(3); return; } Graphics g = bs.getDrawGraphics(); g.setColor(Color.black); g.fillRect(0, 0, getWidth(), getHeight()); g.dispose(); bs.show(); } public static void main(String[] args) { new Game().start(); } } 

错误是:

  Exception in thread "main" java.lang.ClassCastException: java.awt.image.DataBufferByte cannot be cast to java.awt.image.DataBufferInt at ca.vanzeben.game.Game.(Game.java:30) at ca.vanzeben.game.Game.main(Game.java:122) 

要解决您的问题,您需要更改BufferedImage类型

 private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_3BYTE_BGR); 

并将其更改为

 private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 

问题是BufferedImage.TYPE_3BYTE_BGR使用byte [3]来表示每个像素而BufferedImage.TYPE_INT_RGB只使用一个int

问题是image.getRaster().getDataBuffer()返回一个DataBufferByte,并且您正在尝试image.getRaster().getDataBuffer()转换为DataBufferInt。 这是两个不同的类,都是DataBuffer的子类,但是一个不是另一个的子类,因此不可能在它们之间进行转换。

Raster的规范没有清楚地描述是什么决定了getDataBuffer是返回DataBufferByte还是DataBufferInt(或者可能是其他一些DataBuffer)。 但据推测,这取决于被解剖图像的类型。 您可能正在剖析每像素字节的图像,而代码就像每个像素一样需要32位。

实际上,您可能需要从部分删除一些逻辑并将其添加到显式构造函数中,这样您就可以测试返回的DataBuffer类型并相应地处理它,而不是无条件地将其转换为DataBufferInt。