Обрезка без потерь (вырезать и вставить) для JPEG - PullRequest
6 голосов
/ 01 ноября 2011

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

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

А как насчет переключателя jpegtran drop экспериментального? Есть ли известные проблемы? Люди используют это?

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

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

Спасибо!

Ответы [ 2 ]

7 голосов
/ 14 апреля 2015

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

Обзор:

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

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

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

Вот мой дерьмовый пример ASCII-искусства:

  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 может иметь любую ширину и не должен быть кратным размеру блока.
0 голосов
/ 19 июня 2013

Справочная страница jpegtran и два приложения 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.

...