Пакетное изменение размера изображений в новую папку с помощью ImageMagick

У меня есть папка с изображениями поверх 4MB - позвоните в эту папку dsc_big/. Я хотел бы использовать convert -define jpeg:extent=2MB для преобразования их в 2MB и скопировать dsc_big/* в папку dsc_small/, которая уже существует.

Я попробовал convert dsc_big/* -define jpeg:extent=2MB dsc_small/, но создавал изображения с именем -0, -1 и т.д.

Что мне делать?

Ответ 1

convert предназначен для обработки одного входного файла, насколько я могу судить, хотя я должен признать, что не понимаю вывод, который вы получаете. mogrify лучше подходит для пакетной обработки в следующем стиле:

mogrify -path ../dsc_small -define jpeg:extent=2MB dsc_big/*

Но, честно говоря, я считаю это опасным для общего использования (он перезапишет исходные изображения, если вы забудете это -path), поэтому я всегда использую convert в сочетании с циклом for для этого:

for file in dsc_big/*; do convert $file -define jpeg:extent=2MB dsc_small/`basename $file`; done

Вызов basename не требуется, если вы обрабатываете файлы в текущем каталоге.

Ответ 2

Это была команда, которая помогла мне после долгих попыток. Я хотел сделать миниатюры одинакового размера из большого списка больших изображений с переменной шириной и высотой. Это было для создания страницы галереи.

convert -define jpeg:size=250x200 *.jpg  -thumbnail 250x200^ -gravity center -extent 250x200  crop/thumbnail-%d.jpeg

У меня появились миниатюры с размерами, которые имеют одинаковые ширины и высоты.:) благодаря ImageMagick.

Ответ 3

Хотя это старый вопрос, но я добавляю этот ответ в пользу кого-либо еще, который наткнулся на это.

У меня была такая же точная проблема, и, будучи обескуражен использованием mogrify, я написал небольшую утилиту на основе Python под названием easymagick, чтобы облегчить этот процесс, используя внутреннюю систему с помощью команды convert.

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

Ответ 4

Здесь решение без, использующее для петель на консоли

convert *.jpeg -define jpeg:extent=2MB -set filename:f '../dsc_small/%t_small.%e' +adjoin '%[filename:f]'

PS: Если модератор снова удалит мой ответ для "повторного ответа", я больше никогда не отправляю в переполнение стека. Прочтите решение, оно не идентично любому другому решению, которое не используется для циклов на консоли и использует ImageMagick, как запрошено человеком, который разместил вопрос. Если ответ нужно удалить, продолжайте удалять ответы, которые используют другие пакеты, поскольку они фактически не отвечают на вопрос

Ответ 5

Это работает для меня

convert -rotate 90 *.png rotate/image.jpg 

создает изображение-0.jpg, image-1.jpg, image-2.jpg..... в папке "rotate". Не знаю, как сохранить исходные имена файлов.

Ответ 6

Я обнаружил, что cd -инг в нужную папку, а затем с помощью глобальной переменной bash $PWD сделал мой convert, не выдавал никаких ошибок. Я использую ImageMagick, недавно реализованный caption: http://www.imagemagick.org/Usage/text/#caption, чтобы пометить мои изображения базовым именем файла и поместить их в другой каталог в течение первого.

cd ~/person/photos
mkdir labeled
for f in $PWD/*.JPG; do
    width=$(identify -format %w $f)
    filename=$(basename $f .JPG)
convert -background '#0008' -colorspace transparent -fill white -gravity center -size ${width}x100  caption:"${filename}" ${f} +swap -gravity south -composite "$PWD/labeled/${filename}.jpg";
done