Почему я получаю меньший размер изображения jpg при преобразовании из File-> BufferedImage-> byte [] - PullRequest
0 голосов
/ 05 апреля 2019

Я тестирую различные способы сохранения файла jpg в java, и использование ByteArrayInputStream из буферизованного изображения всегда приводит к уменьшению размера файла. Есть ли что-нибудь вокруг этого?

Итак, для всей картины я сейчас пытаюсь написать программу для хранения изображений клиент-сервер (с возможными возможностями редактирования, думаю, Adobe Lightroom). Загрузка на сервер с клиента не является проблемой, просто используйте Files.readAllBytes(currentFile.toPath()); и наоборот при загрузке на клиент с сервера, поскольку он хранится в виде файла.

Проблема в том, что делать, когда я хочу загрузить то же самое изображение, которое я получил (при условии, что изображение отредактировано и хочет быть повторно загружено на сервер). У меня нет файла, созданного из него, поэтому я не могу использовать функции readAllBytes, они хранятся только как Image Object или BufferedImage. Когда я записываю это в ByteArrayInputStream и получаю размер массива byte[] для отправки обратно на сервер, он всегда меньше оригиналов.

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

currentFile = fileChooser.showOpenDialog(window);
            try{

            currentImage = new Image(currentFile.toURI().toString());
            SelectedImageView.setImage(currentImage);
            MainImageLayout.setLeft(SelectedImageView);


            System.out.println("Original file length "+currentFile.length());

                try {
                    BufferedImage bImage = ImageIO.read(currentFile);

                    byte[] fileContent = Files.readAllBytes(currentFile.toPath());
                    System.out.println("bytes from fileContent " +fileContent.length);

                    ByteArrayOutputStream tmp = new ByteArrayOutputStream();
                    ImageIO.write(bImage, "jpg", tmp);
                    tmp.flush();
                    byte[] imageBytes = tmp.toByteArray();
                    tmp.close();
                    long length = imageBytes.length;


                    System.out.println("length of bytearraystream " + length);

Printed Results:
Original file length 196874
bytes from fileContent 196874
length of bytearraystream 117010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...