检查Java中的图像是否为空白

时间:2018-09-01 22:55:49

标签: java image classcastexception

我目前正在为游戏中的角色开发动态动画加载器,为此,我需要检测当前帧是否完全空白以停止加载更多的精灵。 这是我目前用来确定当前图像是否为空白的内容:

public static boolean isBlankImage(BufferedImage b) {
    byte[] pixels1 = getPixels(b);
    byte[] pixels2 = getPixels(getBlankImage(b.getWidth(), b.getHeight()));

    return Arrays.equals(pixels1, pixels2);
}

private static BufferedImage getBlankImage(int width, int height) {
    return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
}

private static byte[] getPixels(BufferedImage b) {
    byte[] pixels = ((DataBufferByte) b.getRaster().getDataBuffer()).getData();
    return pixels;
}

但是,一旦我运行它,就会收到这个烦人的错误:

Exception in thread "Thread-0" java.lang.ClassCastException: 
    java.awt.image.DataBufferInt cannot be cast to java.awt.image.DataBufferByte

我尝试过转换类型,但是我得到的只是:

Exception in thread "Thread-0" java.lang.ClassCastException: 
    java.awt.image.DataBufferByte cannot be cast to java.awt.image.DataBufferInt

我到处搜索了无济于事的答案,所以这是我的问题:有没有更好的功能方法来检查图像是否完全透明?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

空白图像的DataBuffer实际上是DataBufferInt的实例,而原始图像的缓冲区类型为DataBufferByte。 您应该根据要比较的图片类型创建空白图片:

private static BufferedImage getBlankImage(int width, int height, int type) {
    return new BufferedImage(width, height, type);
}

并这样称呼:

getBlankImage(b.getWidth(), b.getHeight(), b.getType())

请注意,就性能和内存使用而言,最好只创建一个空映像一次(或针对每种可能出现的映像类型创建一次)。 图像的类型和大小可能是恒定的,并且可以在创建实际图像的任何位置写入。

现在您有一个合适的空白图像,可以像Is there a simple way to compare BufferedImage instances?一样测试其相等性:

public static boolean compareImages(BufferedImage imgA, BufferedImage imgB) {
  int width  = imgA.getWidth();
  int height = imgA.getHeight();

  // Loop over every pixel.
  for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
      // Compare the pixels for equality.
      if (imgA.getRGB(x, y) != imgB.getRGB(x, y)) {
        return false;
      }
    }
  }

  return true;
}

答案 1 :(得分:0)

该方法必须返回一个字节数组,您正在尝试在DataBufferByte中转换一个DataBuffer。 我已经将名称getPixels更改为getByteArray。既然不一样。 试试这个:

private static byte[] getByteArray(BufferedImage img) {
  byte[] imageInByte = null;
  String format = "jpeg"; //Needs a image TYPE
  try {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(img, format, baos);
    baos.flush();
    imageInByte = baos.toByteArray();
    baos.close();
  } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
  return imageInByte;
}