Проверка, является ли изображение пустым в Java - PullRequest
0 голосов
/ 02 сентября 2018

В настоящее время я работаю над динамическим загрузчиком анимации для персонажей в игре, и для этого мне нужно определить, является ли текущий кадр полностью пустым, чтобы перестать загружать больше спрайтов. Это то, что я сейчас использую, чтобы узнать, пусто ли текущее изображение:

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 голосов
/ 02 сентября 2018

Метод должен возвращать байтовый массив, вы пытаетесь преобразовать DataBuffer в DataBufferByte. Я изменил имя 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;
}
0 голосов
/ 02 сентября 2018

Пустое изображение 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())

Обратите внимание, что с точки зрения производительности и использования памяти может быть лучше создать пустое изображение только один раз (или один раз для каждого типа изображения, который может возникнуть). Вероятно, тип и размер изображения постоянны и записываются везде, где создаются реальные изображения.

Теперь у вас есть правильное пустое изображение, и вы можете проверить его равенство, как в Есть ли простой способ сравнить экземпляры BufferedImage? :

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...