@Ezekiel4
Сын маминой подруги

Почему уменьшился размер изображения при перезаписи?

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

public static void main(String[] args) throws IOException {
	String sourceImage = "C:\\Hydrangeas.jpg";
	File newImage = new File(sourceImage);
	byte[] bytes = Files.readAllBytes(newImage.toPath());
	BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes));
	File outputfile = new File("C:\\out.jpg");
	ImageIO.write(img, "jpg", outputfile);
}

Свойства:
6141e7c9cd189829942730.png
...
6141e7d610b05512444532.png
  • Вопрос задан
  • 54 просмотра
Решения вопроса 2
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
По идее, жмёт его ImageIO.write, больше некому. Судя по всему, контролировать степень cжатия в этом методе нельзя.
ImageReader reader = ...; //ImageIO.getImageReaders(ImageIO.createImageInputStream(stream))
reader.setInput(...);
IIOImage image = reader.readAll(0, null); 

RenderedImage renderedImage = image.getRenderedImage();
ImageWriter writer = ImageIO.getImageWriter(reader);
ImageWriteParam param = writer.getDefaultWriteParam();
paran.setCompressionMode(MODE_COPY_FROM_METADATA);  
writer.setOutput(...);
writer.write(null, image, param);

Должно быть примерно как-то так.
Ответ написан
Комментировать
xez
@xez Куратор тега Java
Senior Junior Roo
Внутри ImageIO использует JPEGImageWriter, видимо, он что-то там пережимает (но это не точно).
Если вы просто хотите прочитать и записать файл, ImageIO вам не нужен.
Используйте тот-же Files из nio:
Files.write(Path.of("C:\\out.jpg"), bytes, WRITE);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы