Не удается преобразовать DataBufferInt в DataBufferByte для определенных изображений.

Я пытаюсь установить порог для своих изображений, но у некоторых из них возникают проблемы с приведением к DataBufferByte. Я размещаю здесь два типа картинок - первый (test1.jpg хорош и может быть приведен к DataBufferByte), второй (test2.jpg выдает исключение).

Картинки:

enter image description here

enter image description here

Вот мой код:

 public static void main(String[] args) throws IOException {

    System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
    BufferedImage bufferedImage = ImageIO.read(new File("/test/test2.jpg"));
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    ImageIO.write(bufferedImage, "jpg", byteArrayOutputStream);
    byte[] input = byteArrayOutputStream.toByteArray();
    InputStream is = new ByteArrayInputStream(input);
    bufferedImage = ImageIO.read(is);
    byte[] data = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();
    Mat mat = new Mat(bufferedImage.getHeight(), bufferedImage.getWidth(), CvType.CV_8UC3);
    mat.put(0, 0, data);
    Mat mat1 = new Mat(bufferedImage.getHeight(),bufferedImage.getWidth(),CvType.CV_8UC1);
    Imgproc.cvtColor(mat, mat1, Imgproc.COLOR_RGB2GRAY);
    byte[] data1 = new byte[mat1.rows() * mat1.cols() * (int)(mat1.elemSize())];
    mat1.get(0, 0, data1);
    Mat dst = new Mat();
    Imgproc.adaptiveThreshold(mat1, dst, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 11, 15);
    MatOfByte matOfByte = new MatOfByte();
    Imgcodecs.imencode(".jpg", dst, matOfByte);
    ByteArrayInputStream inputStream = new ByteArrayInputStream(matOfByte.toArray());
    bufferedImage = ImageIO.read(inputStream);
    ImageIO.write(bufferedImage, "jpg", new File("/test_output/test2.jpg"));

}

Вывод для изображения test1.jpg правильный:

enter image description here

Но второе изображение вызывает исключение

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

на линии

byte[] data = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();

В чем проблема ? Почему одно изображение .jpg конвертируется без проблем, а второе выдает исключение?

Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
0
0
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оба не одного формата. Один использует 8-бит для представления цвета, а другой 3x8-бит (то есть 4 байта, с дополнением или прозрачностью)?

Глядя на это дают:

  • image1 : Данные изображения JPEG, стандарт JFIF 1.01, соотношение сторон, плотность 1x1, длина сегмента 16, базовая линия, точность 8, 449x361, компоненты 3

  • image2 : данные изображения PNG, 617 x 353, 8-бит/цвет RGBA, без чересстрочной развертки

Вы можете использовать метод getDataType() для буфера, чтобы получить размер представления цвета.

Другие вопросы по теме