Составить список изображений с именем
Как создать сортировку изображений в формате:
image_name_1 [IMAGE#1] image_name_2 [IMAGE#2] image_name_3 [IMAGE#3] ...
Используя Imagemagick, я могу сказать что-то вроде:
- ImageMagick для нескольких файлов
- Как сохранить исходное расширение после нескольких манипуляций с файлами
- Изменение размера и обрезка изображений с соотношением сторон 6x4 с шириной 1024 пикселя
- вращать одно изображение, чтобы умножить углы с помощью imagemagick
- Не удается установить ImageMagick на Centos с помощью Yum
montage -label '%f' -mode concatenate -tile 1x foo*.png out.png
Но это добавляет имя файла под изображением +, он не учитывает ширину имени.
Если имя файла печатается (как и в обычной декартовой оси y), это не имеет никакого отношения, поскольку оно находится слева от правильного изображения.
Какой инструмент не вызывает беспокойства, если он доступен для 32-разрядной Linux.
- Регенерировать и перемещать миниатюры
- Как ImageMagic решает цветные карты?
- Граница с ImageMagick
- `convert`ing * .gif to file.pdf зависает / задерживает систему
- imagemagick - многократное расширение
- Как преобразовать цветной pdf в черно-белый?
- Сгладить прозрачность в PDF для удаления тонких белых линий?
- ImageMagick для определения чисел
2 Solutions collect form web for “Составить список изображений с именем”
Я не эксперт ImageMagick, поэтому, вероятно, есть лучший способ сделать это, но вы можете сделать это за 2 шага, сначала добавив текст слева от каждого изображения в промежуточный файл, а затем выполнив монтаж.
for file in foo*.png do convert "$file" -splice 100x0 -gravity west -annotate +10+0 '%f' /tmp/"$(basename "$file")" done montage -mode concatenate -tile 1x /tmp/*.png out.png
Вам необходимо скорректировать значение сращивания 100
чтобы оно было достаточно широким для вашей самой яркой метки имени файла.
Интересной альтернативой, которая использует одну команду, является
convert \ $(for file in foo*.png do echo '(' label:"$(basename "$file")" -gravity center "$file" +append ')' done) -gravity west -append out.png
где вы используете +append
чтобы присоединиться к метке и изображению вместе по горизонтали, затем -append
чтобы присоединиться к результатам по вертикали. Это не совсем то, что вам нужно, но может стать отправной точкой для дальнейших экспериментов.
Если кто-то хочет взломать это еще немного, вот грязный, хотя, возможно, некоторые намеки или помогает уловить интерес.
Процедура запрашивает максимальную высоту и ширину из имен файлов для создания меток, которые подходят. Отсутствует одна особенность – вертикальное центрирование текста (что, TBH, выглядит лучше).
Чтобы получить ширину + высоту для текста (как целого), нужно сделать один из следующих способов:
convert -debug annotate xc: -font Arial -pointsize 24 \ -annotate 0 'Test' null: 2>&1 | \ awk -vRS='[;.]' -F': ' '/width|height/{print $2}'
но выполнение этого для каждого имени файла в цикле добавляет значительное увеличение времени / ресурса при наличии умеренно большого количества файлов +.
В приведенном ниже сценарии я генерирую два временных файла со всеми именами файлов. Один, чтобы получить максимальную высоту, а другой – максимальную ширину.
Процедура прерывается, если имена файлов имеют новую строку.
#!/bin/bash # Default Options font=Arial font_size=12 pad=20 usage() { cat <<EOF_USAGE Usage: $0 [OPTION] <images> -f | --font <font> -z | --font_size <N> -h | --help [f|font] EOF_USAGE exit 1 } # Check for user-options while [[ "$1" ]] do case "$1" in --font|-f)font=$2; shift;; --help|-h) if [[ "$2" = "f" || "$2" = "font" ]] then convert -list font printf "\nCMD: convert -list font\n" fi usage exit 1 ;; --font_size|-z)font_size=$2; shift;; --pad|-p)pad=$2; shift;; --)shift; break;; *)break;; esac shift done # Shallow Next option check (is it a file at all?) ! [[ -f "$1" ]] && printf "Not a file: %s\n" "$1" && exit 2 printf "Processing %d files ...\n" "$#" txt_w=0 txt_h=0 tmp_dir=$(mktemp -d) printf "tmp dir : %s\n" "$tmp_dir" images=("$@") printf "Calculating max width / height ..." # Find max width from file names using font + font-size txt_w=$(convert \ -debug annotate xc: \ -font "$font" \ -pointsize "$font_size" \ -annotate 0 "\"$(printf "%s\n" "${images[@]}")\"" null: 2>&1 | \ sed -n 's/.*Metrics:.* width: \([^.;]*\)[;.].*/\1/p' | sort -n | tail -n1) # Find max height from file names using font + font-size txt_h=$(convert \ -debug annotate xc: \ -font "$font" \ -pointsize "$font_size" \ -annotate 0 "\"$(printf "%s" "${images[@]}")\"" null: 2>&1 | \ sed -n 's/.*Metrics:.* height: \([^.;]*\)[;.].*/\1/p') printf "\r\033[KWidth : %d\n" "$txt_w" printf "Height : %d\n" "$txt_h" # Add padding pixels (( txt_w+=pad*2 )) # Create the labeled images for img in "${images[@]}" do printf "\r\033[KCreating label for \`%s'" "$img" convert "$img" \ -splice ${txt_w}x$txt_h \ -gravity west \ -font "$font" \ -pointsize $font_size \ -annotate +$pad+0 '%f' \ "$tmp_dir"/"$(basename "$img")" done printf "\r\033[KMontage ...\n" # Combine / Collate / Montage montage -mode concatenate -tile 1x $(printf "$tmp_dir/%s " "${images[@]}") out.png printf "Done!\n" # Clean up rm -r "$tmp_dir"
- Система Solaris 10 – дисковое пространство продолжает расти даже после удаления каталога
- Запись на основе не-GUI для gpg