2016-01-15 8 views
2

Я пытаюсь написать программное обеспечение для оптимизации изображений на Java. Первым и самым очевидным шагом было удаление метаданных EXIF, которые я успешно выполнил. Я также попытался сжать изображения с помощью ImageIO и параметра качества сжатия, как показано ниже:Возможно ли оптимизация изображения на Java?

filepath=chosen.getCanonicalPath()+"-temp.jpg"; 
file=new File(filepath); 
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg"); 
if (!writers.hasNext()){ 
    throw new IllegalStateException("No writers found"); 
} 
OutputStream os = new FileOutputStream(file); 
ImageWriter writer = (ImageWriter) writers.next(); 
ImageOutputStream ios = ImageIO.createImageOutputStream(os); 
writer.setOutput(ios); 

ImageWriteParam param = writer.getDefaultWriteParam(); 
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
param.setCompressionQuality(0.9f); 
writer.write(null, new IIOImage(optimized, null, null), param); 

Однако, это действительно не работает все, что хорошо. Он работает в порядке, когда исходное изображение отличается от другого (то есть не jpeg), но при сжатии с jpeg на jpeg иногда даже размер файла больше.

Сайты, как www.tinyjpg.com утверждают, что (и делают) уменьшить размер файла в формате JPEG изображений с помощью 40% -60% с без потери качества. Как они это делают (как процедурно, так и программно)? Какие типы данных они удаляют, и как можно удалить эти данные без потери качества? Возможно ли это на Java?

Любые указания и/или ресурсы, которые вы можете дать мне, очень ценятся!

+0

Предположительно tinyjpg имеет свой собственный алгоритм сжатия. Я сомневаюсь, что вы найдете его в стандартной библиотеке. Можете взглянуть на подвыборку Chroma e.d. – mpkorstanje

+0

Конечно, у них есть свой алгоритм. Мой вопрос в том, действительно ли у вас есть идея, что (процедурно) это могло бы сделать? Какие типы данных можно безопасно отбросить? Как вы узнаете, какие фрагменты данных могут быть отброшены для определенного jpeg? –

+0

* «Сайты, такие как www.tinyjpg.com, претендуют на (и делают) уменьшение размера файла jpeg-изображений на 40% -60% с ** без потери качества **. * Я очень сомневаюсь. Возможно, вы не видите потери качества, и это здорово, но утверждать, что это не так, просто ... ну, давайте пойдем с * крайне маловероятным в общем случае *. –

ответ

1

От Wikipedia - JPG - Lossless further compression Я бы предположил, что Tiny JPG использует улучшенные алгоритмы, которые были разработаны после создания большинства стандартных инструментов. Улучшенные алгоритмы реализованы в PackJPG, который удобно открыт. Кажется, что не существует реализации Java.

В качестве примечания стороны: PackJPG требует улучшения на 20%, в то время как Tiny JPG утверждает, что 70%. Это может быть завышением, но вы, возможно, захотите проверить оба утверждения.

+0

На каком языке PackJPG? Можно ли использовать его в сочетании с программой Java? –

+0

Это приложение командной строки, написанное на C++ по внешнему виду.Вы можете вызывать приложения командной строки из java. http://stackoverflow.com/questions/9346077/java-execute-command-line-program – mpkorstanje

+0

Есть ли способ заставить мою программу проверить, установлен ли PackJPG на локальном компьютере, а если нет, то установите его? –

2

В JPEG Есть три шага, которые оптимизируемыми:

  1. Относительная выборка компонентов. Один образец компонентов Cb или Cr имеет меньшую скорость, чем Y-компонент. Вы сглаживаете значения Cb и Cr, так что 1, 2, 4, 8 или 16 пикселей имеют одинаковое значение Cb или Cr (официально JPEG также поддерживает дробные частоты дискретизации, но большинство декодеров не поддерживают их). Если вы используете коэффициент выборки 4: 1: 1, это сокращает объем данных для сжатия пополам.

  2. (Большая и самая сложная задача), выбрав оптимизированную таблицу квантования.

  3. Создание оптимизированных столов Huffman (легко сделать, но многие кодеры не делают).