Работа с изображениями и обработка файлов в Java - PullRequest
0 голосов
/ 09 мая 2020
  1. У меня есть полностью красное изображение, которое я сделал с помощью MS Paint (красный = 255, синий = 0, зеленый = 0)
  2. Я прочитал это изображение в объект File file
  3. Затем я извлек байты, используя Files.readAllBytes(file.toPath()), в массив байтов byteArray
  4. Теперь я ожидаю, что:

    a) byteArray[0] при преобразовании в битовый поток , должно быть все 1

    b) byteArray[1], при преобразовании в поток битов должно быть все 0

    c) byteArray[2], при преобразовании в поток битов должно быть все 0

потому что, насколько я понимаю, значения пикселей хранятся в порядке RGB с 8 битами для каждого цвета.

Когда я запускаю свой код, я не получаю ожидаемый результат. byteArray[0] все 1 в порядке, но остальные 2 не нули.

Где я ошибаюсь?

Редактировать

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

Размер = 1920p x 1080p

Формат = JPG

Код:

        File file = new File("image_path.jpg");
        byte byteArray[]= new byte[(int) file.length()];
        try {
            byteArray = Files.readAllBytes(file.toPath());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        int bits[] = new int[8];
        for(int j=0; j<8; j++)
        {
            bits[j] = (b[0] & (1 << j))==0 ? 0:1 ;
            //System.out.println("bitsb :"+bitsb[j]);
        }

Обновить

К сожалению, я не могу использовать другие вопросы, содержащие функции библиотеки ImageIO. Я здесь отчасти пытаюсь понять, как хранится само изображение и как я могу написать свой собственный c logi для извлечения файлов изображений и управления ими.

1 Ответ

3 голосов
/ 09 мая 2020

JPEG - это сложный формат изображения.

Он не содержит необработанных пиксельных данных изображения, а вместо этого имеет заголовок, дополнительные метаданные и сжатые данные изображения.

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

Вот краткое руководство: https://docs.oracle.com/javase/tutorial/2d/images/loadimage.html

Вот документация класса BufferedImage, который будет содержать данные изображения: https://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html

Вам нужно будет использовать одну из функций getRGB для доступа к необработанным данным пикселей. Убедитесь, что ваше изображение имеет 24-битный цветовой формат, если вы хотите, чтобы каждый компонент цвета занимал ровно 1 байт!

JPEG поддерживает другие форматы, такие как 32 и 16 бит!

В качестве альтернативы , сохраните изображение как 24-битный несжатый BMP. Файл будет намного больше, но его читать намного проще, поэтому вам не нужно использовать библиотеку. Просто пропустите заголовок , затем прочтите необработанные байты.

Еще более простой формат изображения для работы: PBM / PPM .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...