Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Как сохранить размер файла изображения


Автор: lugaru 22.4.2012, 23:54
Не могу разобраться с парадоксом, при копировании изображения теряется вся его метаинформация и размер. Как скопировать фото точно, без потери все этого, при всем этом размер файла в пикселях идентичен!!!

Пример кода:

Код

BufferedImage img = ImageIO.read(new File("D:/1.jpg"));
ImageIO.write(img, "jpg", new File("D:/test/1.jpg"));


Результат:
D:/1.jpg - 2Мб  - вся мета информация есть
D:/test/1.jpg - 0,5Мб  - мета информации нет
Почему так выходит?

Автор: jk1 23.4.2012, 09:06
Цитата

Почему так выходит?


Потому что с метаданными надо работать отдельно. Ваш код копирует только информацию о пикселях и ничего больше. 
Правильное копирование метаданных будет выглядеть как-то так
Код

ImageWriter writer = ImageIO.getImageWritersBySuffix("jpeg").next();
ImageReader reader = ImageIO.getImageReader(writer);
reader.setInput(new FileImageInputStream(file));
...
IIOMetadata meta = reader.getImageMetadata(0);
...
JPEGImageWriteParam param = new JPEGImageWriteParam(Locale.getDefault());
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(1);
param.setOptimizeHuffmanTables(true);

IIOImage iioimage = new IIOImage(img, null, meta);
writer.setOutput(ImageIO.createImageOutputStream(new File("new.jpg")));
writer.write(null, iioimage, param);

копирование собственно пикселей в примере для простоты опущено

Автор: lugaru 23.4.2012, 10:38
Цитата(jk1 @ 23.4.2012,  09:06)
Потому что с метаданными надо работать отдельно. Ваш код копирует только информацию о пикселях и ничего больше. 
Правильное копирование метаданных будет выглядеть как-то так
[code=java]
ImageWriter writer = ImageIO.getImageWritersBySuffix("jpeg").next();
ImageReader reader = ImageIO.getImageReader(writer);
....

Спасибо большое, ясно, но в чем еще дело, даже при копировании просто пицселей качество не должно страдать, по идеи, а оно ухудшаеться и не может же метеданные занимать 1.5Мб с 2Мб, или я что-то не понимаю =(

Автор: jk1 23.4.2012, 11:57
Цитата

Спасибо большое, ясно, но в чем еще дело, даже при копировании просто пицселей качество не должно страдать


Тот способ, что Вы используете, использует для записи параметры сжатия jpeg по умолчанию, которые совершенно необязательно совпадают с таковыми у исходника. Отсюда и разница в размере.

Автор: AlexeyVorotnikov 24.4.2012, 09:24
Может, просто файл скопировать? Целиком.

Автор: lugaru 24.4.2012, 11:32
Цитата(jk1 @ 23.4.2012,  11:57)
Тот способ, что Вы используете, использует для записи параметры сжатия jpeg по умолчанию, которые совершенно необязательно совпадают с таковыми у исходника. Отсюда и разница в размере.

А как определить метод сжатия что бы задать 100% верный?

Добавлено через 3 минуты и 32 секунды
Цитата(AlexeyVorotnikov @ 24.4.2012,  09:24)
Может, просто файл скопировать? Целиком.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)