Обрезка без потерь (вырезать и вставить) для JPEG

Я ищу примеры / сообщения в блоге / и т. Д. Операций JPEG без потерь (обрезать н капля = вырезать и вставить). Я знаю, что есть программа jpegtran (http://jpegclub.org/jpegtran), которая может выполнять обрезку без потерь (в определенных ситуациях), но, похоже, не хватает хорошей документации. Да, я попробовал Google.

jpegtran также есть экспериментальная ветвь, которая позволяет отбрасывать без потерь (= вставлять) в определенных ситуациях, но документация этого, кажется, еще хуже.

Как насчет Jpegtran's drop переключатель экспериментальный? Есть ли известные проблемы? Люди используют это?

drop кажется действительно классной и полезной функцией, и мне кажется странным, что она была экспериментальной в течение более 10 лет...

И да, для таких операций можно использовать форматы без потерь, такие как PNG, но меня особенно интересуют JPEG.

Спасибо!

2 ответа

Я потратил слишком много времени, пытаясь это выяснить, поэтому надеюсь, что это поможет кому-то еще. Этот вопрос очень важен для Google при поиске документов с помощью этой так называемой функции "обрезка и удаление".

Обзор:

jpegtran -drop позволяет "перетаскивать" блоки из одного JPEG в другой JPEG.

Он заменяет только существующие блоки, не расширяет ввод, поэтому вы не можете объединить два JPEG только -drop,

Тем не менее, если вы поставите -crop Параметр больше входного изображения, JPEGTran запишет пустые (серые) блоки для увеличения до желаемого размера. Вы можете использовать -drop заменить эти новые, пустые блоки желаемым изображением.

Вот мой дерьмовый пример ASCII-art:

  1. У вас есть два изображения, A.jpg а также B.jpg оба имеют размеры 256x256, Мы хотим объединить эти бок о бок, чтобы получить 512x256 образ.

    +---------+  +---------+
    |         |  |         |
    |  A.jpg  |  |  B.jpg  |
    |         |  |         |
    +---------+  +---------+
    
  2. "Uncrop" A.jpg до необходимого размера. -crop параметр является стандартным обозначением геометрии X11: WIDTHxHEIGHT+X+Y Положительные значения X/Y измеряются сверху / слева и отрицательные значения снизу / справа соответственно.

    jpegtran -crop 512x256+0+0 -outfile O.jpg A.jpg
    
    +---------+---------+
    |         \         |
    |  O.jpg  \ (blank) |
    |         \         |
    +---------+---------+
    
  3. Теперь "капля" B.jpg в новый, пустой раздел в O.jpg -drop Параметр использует только исходные координаты X/Y.

    jpegtran -drop +256+0 B.jpg -outfile O.jpg O.jpg
    
    +---------+---------+    +---------+
    |         \         |    |         |
    |  O.jpg  \    o<========|  B.jpg  |
    |         \         |    |         |
    +---------+---------+    +---------+
    
  4. Готово! Теперь у вас есть один файл, O.jpg с размерами 512x256, который содержит объединенное содержимое A.jpg а также B.jpg

    +-------------------+
    |                   |
    |       O.jpg       |
    |                   |
    +-------------------+
    

Заметки:

  • A.jpg а также B.jpg должен иметь одинаковую высоту. Если B.jpg выше, он будет отрезан. Если A.jpg выше, правая сторона изображения будет иметь пустую полосу отступов.
  • A.jpg должна иметь ширину, которая заканчивается на весь блок. (Обычно означает делится на 8?)
  • B.jpg может иметь любую ширину и не должен быть кратным размеру блока.

jpegtran Страница man и два приложения для Windows ( JpegCrop и JpegJoin) довольно хороши. Если у вас есть конкретная процедура, которую вы пытаетесь выполнить, обновите свой вопрос, чтобы объяснить это.

Я сам использовал -drop сделать спрайты JPEG без потерь на домашней странице моей компании:
http://bestelec.co.uk/images/front/features.jpg

  1. Сначала я обрезал исходные фотографии (на границах пикселей), чтобы охватить требуемый кадр. Этот шаг можно сохранить без потерь, используя формат не JPEG. [Арт-директор]
  2. Затем я масштабировал эти изображения до необходимой ширины, как того требует веб-дизайн. Опять же, сохранены без потерь, так как это промежуточные этапы.
  3. Затем я пробежал их cjpeg с различными вариантами качества, пока я не нашел настройки самого низкого качества, с которыми мне было удобно.
  4. (Необязательно) Затем я обрезал нижний край каждого отдельного изображения пониженного качества, чтобы выровнять его по предпоследней границе MCU на вертикальной оси. Это позволило мне объединить фотографии в вертикальную полосу без пропусков. Мой веб-дизайн не требует определенной высоты, поэтому я был свободен выбрать здесь. Если экстенты ваших компонентных изображений не выровнены по границам MCU (как мои правые края не были), убедитесь, что вы используете сборку jpegtran / JpegJoin за октябрь 2012 года, в противном случае только первое изображение будет отображаться без обрезки.
  5. Наконец, я объединил изображения в один JPEG, и прогнал результат через jpegtran -optimise -progressive -copy none сделать его как можно меньше и прогрессивнее.

В результате я сократил три HTTP-запроса до одного, что позволило раньше запрашивать последующие ресурсы на том же хосте и сократить время загрузки. Для меня это была большая победа, чем преобразование изображений в WebP и их индивидуальное обслуживание, особенно с учетом того, что большинство наших корпоративных посетителей используют IE.

Другие вопросы по тегам