it-roy-ru.com

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

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

32
CompilingCyborg

Вы можете использовать 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%
71
betabandido

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

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

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

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

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

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

Sudo apt-get install nautilus-image-converter

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

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

0
stefanbc

есть несколько ответов:

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/')' {} \;
0
loic.jaouen

Вы можете использовать инструмент 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 без сохранения соотношения сторон в текущем каталоге.

0
Sarvsav Sharma