imagemagick создать документ с двумя изображениями на странице А4 - PullRequest
0 голосов
/ 23 мая 2018

Используя Ubuntu 14.04 Linux, у меня есть список .jpg изображений в папке с именами Capture 01.jpg, Capture 02.jpg и т. Д., И я хотел бы создать командную строку, которая создает многостраничный документ с A4размер страниц, где каждая страница содержит 2 изображения в указанном порядке, с именем файла в качестве заголовка и страницами, содержащими нижний колонтитул, например «Страница 1 из 41».См., Например:

------
Capture 01.jpg

[image]

Capture 02.jpg

[image]
Page 1 of 41
------
Capture 03.jpg

[image]

Capture 04.jpg

[image]
Page 2 of 41
------
...

Все изображения имеют одинаковый размер, примерно 1600x1200 пикселей.

Зная немного о том, как работает ImageMagick, я предполагаю, что это потребует какого-то collateили montage, но я не уверен, как сделать так, чтобы она соответствовала страницам формата А4 и как отформатировать их для печати (pdf?).

Любые рекомендации?

РЕДАКТИРОВАТЬ: Я нашелвопрос, касающийся добавления имени файла для изображения:

Наложение имени файла изображения с помощью ImageMagick (или аналогичного)

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

По запросу fmw42, вот моя версия, которая, на мой взгляд, является улучшением благодаря лучшей обработке «сложных» имен файлов.

Сначала некоторые настройки.
Создание каталога, загрузкаimage, скопируйте x6 и дайте новые дурацкие имена.

#!/bin/bash

cd ~/Desktop
mkdir testimagesSO
cd testimagesSO
wget "https://i.imgur.com/GeaEv21.png"

mv *.png testimage.png

Names=("Drøbaksundet\n img #1*" "Drøbaksundet\n img #2*" "Drøbaksundet\n img #3*" \
       "Drøbaksundet\n img #4*" "Drøbaksundet\n img #5*" "Drøbaksundet\n img #6*" )

echo "${#Names[@]}"

for f in "${Names[@]}"
do
  cp testimage.png "$f".png
done

rm testimage.png

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

arr=(*)
num=${#arr[*]}
numm1=$((num-1))
npp=2
numpages=$((($num+$npp-1)/$npp))
echo "numpages=$numpages"
pagenum=1
(
for ((i=0; i<numm1; i=i+2)); do
  j=$((i+1))
  convert "${arr[$i]}" "${arr[$j]}" -background white -gravity center -append \
  -resize 595x842 -extent 595x842 +repage \
  -font arial -pointsize 18 -undercolor white -fill black \
  -gravity north -annotate +0+10 "${arr[$i]}" \
  -annotate +0+431 "${arr[$j]}" \
  -gravity south  -annotate +0+10 "Page $pagenum of $numpages" miff:-
  pagenum+=1
done
) | convert - ../result2.pdf

У меня нет удобного места для размещения PDF-файлов, но это более или менее получаемый результат (представьте, что он разделен на 3 страницы формата А4)..

enter image description here

0 голосов
/ 24 мая 2018

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

Я взял это одно изображение:

enter image description here


, продублировали его еще 5 раз и пронумеровали в последовательности:

lena_01.png
lena_02.png
lena_03.png
lena_04.png
lena_05.png
lena_06.png

и поместили в новую папкуНа моем компьютере он называется «test».

Затем, используя ImageMagick 6 со сценариями оболочки Unix bash, я создал цикл в подоболочке, чтобы сохранять промежуточные изображения в формате MIFF: без необходимости сохранения.их индивидуально.Затем я передал вывод в новый конверт, чтобы сохранить в формате PDF.Обратите внимание, что подоболочка обозначается круглыми скобками, окружающими цикл for.

Вот набор команд:

#!/bin/bash

cd
cd desktop/test
arr=(`ls`)
num=${#arr[*]}
numm1=$((num-1))
numpages=`echo "scale=0; ($num+0.5)/2" | bc`
pagenum=1
(
for ((i=0; i<numm1; i=i+2)); do
  j=$((i+1))
  convert "${arr[$i]}" "${arr[$j]}" -background white -gravity center -append \
  -resize 595x842 -extent 595x842 +repage \
  -font arial -pointsize 18 -undercolor white -fill black \
  -gravity north -annotate +0+10 "${arr[$i]}" -annotate +0+431 "${arr[$j]}" \
  -gravity south -annotate +0+10 "Page $pagenum of $numpages" miff:-
  pagenum=$((pagenum+1))
  done
) | convert - ../result.pdf


где arr - массив имен изображений в тестекаталог.Обратите внимание, что размер страницы А4 составляет 595x842 при разрешении 72 т / д при разрешении 8,27 × 11,7 дюйма

result.pdf

Если вы хотите оставить пробелы в именах файлов, затем вы можете изменить IFS на новую строку перед оператором arr, а затем изменить его обратно на пробел.Например:

lena 01.png
lena 02.png
lena 03.png
lena 04.png
lena 05.png
lena 06.png

Код изменится на следующий:

cd
cd desktop/test
OLDIFS=$IFS
IFS=$'\n'
arr=(`ls`)
num=${#arr[*]}
numm1=$((num-1))
numpages=`echo "scale=0; ($num+0.5)/2" | bc`
echo "numpages=$numpages"
pagenum=1
IFS=$OLDIFS
(
for ((i=0; i<numm1; i=i+2)); do
j=$((i+1))
convert "${arr[$i]}" "${arr[$j]}" -background white -gravity center -append \
-resize 595x842 -extent 595x842 +repage \
-font arial -pointsize 18 -undercolor white -fill black \
-gravity north -annotate +0+10 "${arr[$i]}" \
-annotate +0+431 "${arr[$j]}" \
-gravity south  -annotate +0+10 "Page $pagenum of $numpages" miff:-
pagenum=$((pagenum+1))
done
) | convert - ../result2.pdf

result2.pdf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...