Исключение Java «Исключение в потоке «main» java.lang.ClassCastException: [B не может быть преобразован в [I» при вызове java.awt.image.BufferedImage.CopyData()

#java #image #bufferedimage #classcastexception

#java #изображение #bufferedimage #classcastexception

Вопрос:

В следующем коде я пытаюсь объединить некоторые png размером 1024 * 1024 в несколько png большего размера. Код завершается ошибкой с этим исключением:

 Exception in thread "main" java.lang.ClassCastException: [B cannot be cast to [I
    at sun.awt.image.IntegerInterleavedRaster.setDataElements(Unknown Source)
    at java.awt.image.BufferedImage.copyData(Unknown Source)
    at mloc.bs12.mapimagemerger.Merger.main(Merger.java:27)
  

Вероятно, это что-то маленькое и глупое, что я упустил из виду, но я не могу найти ничего неправильного в коде.
Код:

 import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
public class Merger {
    public static void main(String[] args) {
        String toX, toY, toZ;
        try {
        toX = args[0];
        toY = args[1];
        toZ = args[2];
        } catch(ArrayIndexOutOfBoundsException E) {
            //E.printStackTrace();
            toX = "3";
            toY = "5";
            toZ = "4";
        }
        int yproper = 1;
        for(int z = 1; z <= Integer.parseInt(toZ); z  ) {
            BufferedImage img = new BufferedImage(Integer.parseInt(toX) * 1024, Integer.parseInt(toY) * 1024, BufferedImage.TYPE_INT_RGB);
            for(int x = 1; x <= Integer.parseInt(toX); x  ) {
                for(int y = 1; y <= Integer.parseInt(toY); y  ) {
                    BufferedImage simg = img.getSubimage(x*1024, y*1024, 1024, 1024);
                    BufferedImage tempimg = loadImage(x   "-"   y   "-"   z   ".png");
                    WritableRaster rsimg = simg.getRaster();
                    rsimg = tempimg.copyData(rsimg); <-- Error!
                    yproper  ;
                }
            }
            saveImage(img, z   ".png");
        }
    }
    public static BufferedImage loadImage(String path) {
        BufferedImage bimg = null;
        try {

            bimg = ImageIO.read(new File(path));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bimg;
    }
    public static void saveImage(BufferedImage img, String path) {
        try {

            ImageIO.write(img, "png", new File(path));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return;
    }
}
  

Я думаю, что к настоящему времени я с этим разобрался.
Загружаемые мной изображения не были того же типа, что и изображение, которое я создал. (Я все еще не уверен, к какому типу они относятся, каков тип 13?)
У меня есть еще несколько проблем, но эта ошибка исправлена.
(Больше проблем, как в этом.)

Комментарии:

1. @Mloc: просто используйте {} кнопку в редакторе для форматирования кода.

2. По какой-то причине все это собиралось в кучу.

3. Привет @Mloc, не могли бы вы, пожалуйста, повторно отредактировать исключение, похоже, что есть только его часть. Плюс, пожалуйста, укажите во фрагменте кода, какая строка вызывает исключение.

4. @Mloc Первая строка исключения также выглядит неправильно. Плюс также в вашем коде поместите что-то вроде // здесь у нас есть исключение

5. @Mloc Ок. Как насчет решения с точки зрения кодирования. Как вы это закодировали?

Ответ №1:

Библиотека преобразует массив байтов в массив int, чего вы не можете сделать.

Я не знаком с BufferedImage, но можно предположить, что файл PNG, который вы читаете, обрабатывается как байтовые значения вместо целых значений.

Комментарии:

1. 1 за обнаружение проблемы. Может быть, у вас также есть решение для этого?