Я тестирую различные способы сохранения файла 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