Вопрос по ubuntu, image – Как рекурсивно изменить размер изображения в Ubuntu в терминале?

31

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

Ваш Ответ

7   ответов
0

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

sudo apt-get install nautilus-image-converter

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

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

Работает как шарм. Благодарю.
68

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

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

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

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

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

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

find . -name "*.jpg" | xargs mogrify -resize 50%
В вопросе упоминается «набор организованных папок». Требуется & quot; найти & quot ;.
@horsh спасибо, теперь я понимаю, что OP явно указал способ обращения с рекурсией. Я исправил ответ, чтобы включить рекурсию.
@CompilingCyborg Я изменил ответ, чтобы он обрабатывал рекурсию в подпапках текущей папки, ища все изображения в формате jpg.
Это рекурсивный процесс? f - это переменная, а $ FILES - путь к файлу, верно? CompilingCyborg
для f в `find .`
-2

You can copy/paste this code in ubuntu, and save it as "resize.sh"

#! / bin / bash -e

CUR_DIR = `pwd`

CD $ 1

#resize

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

делать

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

сделанный

CD $ CUR_DIR

After saving this file, run it from terminal using "./rotate.sh folder_containing_images"

For more such stuff, visit here

Веб-страница не найдена для веб-адреса:installthetech.com
1

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

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

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

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 для каждого совпадения и дать как имя входного файла, так и имя выходного файла, с som, например:

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/')'. This script receives the file name in argument $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/')' {} \;
Мммм ... с этим методом вам нужно будет создать новый процесс для выполненияsh для каждого JPEG, и новый процесс для выполненияsed для каждого отдельного JPEG и нового процесса для выполненияconvert для каждого JPEG, и это будет больно, если у вас много изображений. Я бы предложил использоватьmogrify который вы вызываете только один раз, и он делает все ваши изображения из одного процесса и / или с помощью GNU Parallel, или, по крайней мере, вырабатывает новое имя файла с помощью подстановки параметра оболочки вместоsed.
Абсолютно; сmogrifyВам не нужно придумывать второе имя файла, и вся сложность исчезла. Моя точка зрения заключалась в том, что работает сmogrify не сconvert, как написано в паре ответов.
Я хотел сказать, чтоmogrify а такжеconvert не просто взаимозаменяемы, как написано в паре ответов. Конечно;mogrify делает все, если у вас все в порядке с перезаписью исходного файла. Если вы этого не сделаете, вы хотите использоватьconvert, и это становится немного более грязным. Избавьтесь от sed, хорошая идея:find -name '*.jpg' -exec sh -c 'convert -resize 50% $0 "${0%\.jpg}-th.jpg"' {} \; или просто с префиксом: & quot; th - $ {0} & quot; ИМХО, я не уверен, что стоимость создания процессов имеет большое значение по сравнению с задачей обработки изображений ... но я согласен; зачем, черт возьми, создавать новый процесс, когда он не нужен?
0

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

4

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

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

find . -name "*.jpg" -print0 | xargs -0 convert -resize 50%
find . -name "*.jpg" -print0 | xargs -0 mogrify -resize 50%
Сquality тоже работает:find . -name "*.jpg" -print0 | xargs -0 mogrify -quality 70%

Похожие вопросы