Составить список изображений с именем

Как создать сортировку изображений в формате:

image_name_1 [IMAGE#1] image_name_2 [IMAGE#2] image_name_3 [IMAGE#3] ... 

Используя Imagemagick, я могу сказать что-то вроде:

 montage -label '%f' -mode concatenate -tile 1x foo*.png out.png 

Но это добавляет имя файла под изображением +, он не учитывает ширину имени.

Если имя файла печатается (как и в обычной декартовой оси y), это не имеет никакого отношения, поскольку оно находится слева от правильного изображения.

Какой инструмент не вызывает беспокойства, если он доступен для 32-разрядной Linux.

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" 
  • Как изменить размер только пропущенных изображений?
  • ImageMagick: PNG to GIF: сделать любой не полностью прозрачный пиксельный массив
  • Конвертировать PDF в JPG, сохраняя одно и то же имя; изменить размер и создать превью, а затем переименовать?
  • различия между -resize и -size, а также между -repage и -page для преобразования?
  • Граница с ImageMagick
  • Как извлечь комментарий из файла ppm?
  • Imagemagick изменяет размер изображения с ограничением соотношения высоты и размера
  • конвертирование PDF-изображений в файлы png делает снимки слишком маленькими
  • Могу ли я выбрать регион для скриншота с помощью клавиатуры при импорте
  • Доступ к справочной странице ImageMagick
  • Imagemagick на открытом wrt-маршрутизаторе «UnableToOpenConfigureFile»
  • Linux и Unix - лучшая ОС в мире.