Пакетная обрезка jpeg без потерь в Linux

Мне нужно без потерь обрезать ряд изображений в формате jpeg на 20 пикселей с правой стороны в Linux.

Я проверил jpegtran, но перед кадрированием ему нужен размер файла в пикселях, и я не знаю, как создать пакетный файл с этим.

Как я могу программно обрезать 20 пикселей с правой стороны изображения без потерь?


person user2708058    schedule 07.11.2013    source источник
comment
Если вы довольны jpegtran и вам просто нужны пиксели, вы можете получить это с помощью ImageMagick Identification. вы также можете автоматизировать его для пакета с помощью некоторых команд оболочки.   -  person acfrancis    schedule 08.11.2013
comment
Линукс или Виндовс. Таким образом, вопрос, возможно, должен звучать так: как мне это сделать в оболочке Linux или Windows. Я посмотрю на ImageMagick.   -  person user2708058    schedule 08.11.2013
comment
Что значит без потерь? JPEG уже с потерями.   -  person stark    schedule 08.11.2013
comment
Не обязательно, определенные операции можно выполнять без перекодирования остального изображения. Как обрезка.   -  person user2708058    schedule 08.11.2013


Ответы (2)


Мой сценарий оболочки немного заржавел, поэтому, пожалуйста, сделайте резервную копию ваших изображений, прежде чем использовать этот сценарий.

#!/bin/bash
FILES=/path/to/*.jpg

for f in $FILES
do
    identify $f | awk '{ split($3, f, "x"); f[1] -= 20; cl = sprintf("jpegtran -crop %dx%d+0+0 %s > new_%s", f[1], f[2], $1, $1); system(cl); }'
done

Обратите внимание:

  • Настройте путь к правильному значению
  • Вам нужен *.jpeg?
  • identify — это команда ImageMagick
  • awk возьмет размеры в пикселях из identify для использования в качестве параметра (с уменьшением ширины на 20 пикселей) для jpegtran для обрезки изображения.
  • Новое изображение сохраняется как new_[old_name].jpg
  • jpegtran может настроить область обрезки, чтобы она работала без потерь. Убедитесь, что полученные изображения имеют правильный размер и не немного больше.
person acfrancis    schedule 08.11.2013
comment
идентификация распечатывает размеры изображения, которые вам нужны (скорректированы) в качестве параметра для jpegtran - person acfrancis; 08.11.2013
comment
Да, ваше объяснение навело меня на мысль, что что-то еще меняет размер изображения перед передачей его в jpegtran, но чтение команд прояснило это. - person Havenard; 08.11.2013
comment
Случайно на этой неделе я столкнулся с ситуацией, когда я искал фоны для нового веб-сайта-прототипа, я нашел тот, который был бы идеальным, если бы я перевернул его вверх дном, но был разочарован тем, что файл увеличился в размере. Эта программа сделала свое дело и даже уменьшила размер файла, довольно изящная вещь. - person Havenard; 08.11.2013

Очень похоже на принятый ответ, следующее также будет работать с именами файлов, содержащими пробелы. И, возможно, проще использовать встроенную в identify опцию -format вместо разбора вывода. с авк.

#!/bin/bash

X=0; Y=0   # offset from top left corner

for f in /path/to/*.jpg; do
    read -r W H < <(identify -format '%w %h' "$f") # get width and height
    (( W -= 20 ))                                  # substract 20 from width
    out="${f%%.jpg}-crop-20.jpg"                   # add "-crop-20" to filename
    jpegtran -crop ${W}x$H+$X+$Y "$f" > "$out"     # crop
done
person mivk    schedule 17.11.2020