Как рекурсивно изменить размер изображения в Ubuntu в терминале?

У меня есть несколько изображений, хранящихся в наборе организованных папок. Мне нужно изменить размер этих изображений до определенного процента рекурсивно из их родительского каталога. Я использую Ubuntu 11.10 и предпочитаю учиться делать это прямо из терминала.

10 ответов

Решение

Вы могли бы использовать imagemagick. Например, чтобы изменить размеры всех изображений JPG в текущем каталоге до 50% от их первоначального размера, вы можете сделать следующее:

for f in `find . -name "*.jpg"`
do
    convert $f -resize 50% $f.resized.jpg
done

Полученные файлы будут иметь ".jpg" дважды в своих именах. Если это проблема, вы можете проверить следующие варианты.

Для просмотра / поиска файлов для изменения размера вы также можете использовать xargs. Пример:

find . -name "*.jpg" | xargs convert -resize 50%

Это создаст копии изображений. Если вы просто хотите конвертировать их на месте, вы можете использовать:

find . -name "*.jpg" | xargs mogrify -resize 50%

Вы также можете использовать

sudo apt-get install nautilus-image-converter

Но это работает только для изображения в текущей папке. Вы просто устанавливаете, а затем нажимаете правой кнопкой мыши на изображение или несколько изображений и выбираете нужный размер, и все.

Я считаю, что это также использует imagemagick.

Расширяя ответ от @betabandido

Если в именах файлов или имен папок, в которых находятся изображения, есть пробелы, то следует использовать -print0 с find и -0 с xargs, чтобы избежать ошибок синтаксического анализа.

find . -name "*.jpg" -print0 | xargs -0 convert -resize 50%
find . -name "*.jpg" -print0 | xargs -0 mogrify -resize 50%

Старый вопрос, но я считаю, что это самый простой метод, который также имеет дело с пробелами и нестандартными символами.

      find -iname "*.jpg" -exec convert {} -resize 1280x1280 {} \;

(это мое решение с максимальным размером, но если вы хотите изменить размер в процентах, просто адаптируйтесь)

      find -iname "*.jpg" -exec convert {} -resize 50% {} \;

Это также работает, если вы дадите новое разрешение изменения размера:

convert $f.jpg -size 1024x768 $f.resized.png

Я немного изменил код принятого ответа, чтобы включить файлы png и добавить префикс вместо постфикса к имени файла, чтобы упростить выбор всех файлов с измененным размером одновременно.

      for p in `find . -name "*.jpg" -o -name "*.png"`
do
    d=${p%/*}
    f=${p##*/}
    b=${f%.*}
    e=${f##*.}
    convert $p -resize 33% $d/thumb.$b.$e
done

С небольшой модификацией можно воссоздать структуру каталогов в отдельный каталог и иметь только файлы с измененным размером с той же структурой каталогов. Другим вариантом является выравнивание структуры каталогов и создание случайно сгенерированных имен файлов, а также сбор сопоставления путей с файлом CSV для каждого файла миниатюры с добавлением.

Вы можете использовать инструмент imagemagick для пакетного изменения размера.

Это будет поддерживать соотношение сторон

$ convert dragon.gif    -resize 64x64  resize_dragon.gif

Это не будет поддерживать соотношение сторон

$ convert dragon.gif    -resize 64x64\!  exact_dragon.gif

$ cat resize.sh 
#!/bin/bash
for f in `find . -name "*.jpg"`
do
    convert $f -resize 45x60\!  $f.resize.jpg
done

Это изменит размер изображения до 45x60 без сохранения соотношения сторон в текущем каталоге.

Есть несколько ответов, таких как:

find . -name "*.jpg" | xargs convert -resize 50%

это не сработает, поскольку расширит список следующим образом:convert -resize 50% a.jpg b.jpg c.jpg который изменит размер a.jpg в c-0.jpg, b.jpg в c-1.jpg и разреши c.jpg нетронутым.

Таким образом, вы должны выполнить команду resize для каждого совпадения и дать как имя входного файла, так и имя выходного файла, например:

find . -name "*.jpg" | xargs -n 1 sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')'

каждый матч find индивидуально проходит мимо xargs -n 1 к скрипту изменения размера: sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')', Этот скрипт получает имя файла в аргументе $0, использует sed сделать имя выходного файла путем замены оригинала .jpg суффикс -th.jpg один. И это работает convert Команда с этими двумя именами файлов.

Вот версия без xargs но find -exec:

find -name '*.jpg' -exec sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')' {} \;

Без XARGS и замены оригинала:

После многих часов борьбы с незнанием Linux (первый год) я наконец-то нашел для себя лучшее решение:

  • использование ImageMagick;
  • без XARGS;
  • замена исходного файла;
  • установка определенного максимального значения ширины и высоты с сохранением соотношения сторон (700 пикселей в следующем коде);
  • включение вариантов регистра букв во избежание пропусков;
  • рекурсивный поиск во всех подпапках.

Это код терминала:

      for f in `find . -name "*.jpg" -or -name "*.JPG" -or -name "*.jpeg" -or -name "*.JPEG"` ; do convert "$f" -resize 700 "$f" ; done

Я надеюсь, что это поможет многим из вас; в любом случае он уже сохранен для моих будущих нужд.

Вы можете скопировать / вставить этот код в Ubuntu и сохранить его как "resize.sh"

#! / bin / bash -e

CUR_DIR = `pwd`

CD $ 1

#resize

для файла в *.jpg;

делать

конвертировать $file -resize 50% $file;

сделанный

CD $CUR_DIR

После сохранения этого файла запустите его из терминала, используя "./rotate.sh folder_containment_images"

Для большего количества таких вещей, посетите здесь

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