Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сохранить размер файла изображения, при копировании изображения файл выходит 
:(
    Опции темы
lugaru
Дата 22.4.2012, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 18.11.2011

Репутация: нет
Всего: нет



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

Пример кода:

Код

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Мб  - мета информации нет
Почему так выходит?

PM MAIL   Вверх
jk1
Дата 23.4.2012, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 5
Всего: 75



Цитата

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


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

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);

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


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
lugaru
Дата 23.4.2012, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 18.11.2011

Репутация: нет
Всего: нет



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

Спасибо большое, ясно, но в чем еще дело, даже при копировании просто пицселей качество не должно страдать, по идеи, а оно ухудшаеться и не может же метеданные занимать 1.5Мб с 2Мб, или я что-то не понимаю =(
PM MAIL   Вверх
jk1
Дата 23.4.2012, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 5
Всего: 75



Цитата

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


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


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
AlexeyVorotnikov
Дата 24.4.2012, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

Репутация: 3
Всего: 18



Может, просто файл скопировать? Целиком.


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
lugaru
Дата 24.4.2012, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 18.11.2011

Репутация: нет
Всего: нет



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

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

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

Если бы можно было бы так я бы не мучился))) Суть всей программы пометить логотипом сайта/фотографа каждую фотографию, с сохранением мета информации и качества. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1024 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.