在一个文件夹中,我有数百个名为的文件:
miserables-0001.png
miserables-0002.png
miserables-0003.png
...
miserables-0010.png
miserables-0011.png
...
miserables-0100.png
miserables-0101.png
...
miserables-0999.png
miserables-1000.png
...
我想要的是使用imagemagick -append命令将每20个文件垂直追加到一个png中。 那么,前20个文件
miserables-0001.png miserables-0002.png ... miserables-0020.png
将附加在
中miserables-appended-0001.png
和第二个20个文件
miserables-0021.png miserables-0022.png ... miserables-0040.png
将附加在
中miserables-appended-0002.png
等等。
答案 0 :(得分:0)
有两种方法可以实现这一目标:
从文件中读取
将文件名放在文本文件中。假设您的file.txt
具有输入名称,例如:
悲惨-0001.png
悲惨-0002.png
悲惨-0003.png
...
悲惨-0020.png
然后您可以通过以下方式申请convert
convert @file.txt result.gif
输入范围
您可以根据编号为convert
提供一系列输入。对于您的输入,您可以:
convert miserables-000%d.png[1-9] result.gif
阅读ImageMagick documentation了解更多详情。
答案 1 :(得分:0)
%d
方法不起作用,因为它忽略了前导零,你必须补偿每个范围1-9 10-99 100-999 1000-9999,这使得很难抓住大块的20。
所以这是带有两个堆叠计数for /l
循环的文件方法
要获得前导零,最简单的是将数字加1,并使用带有子串的最后4位数。
要检查结果,批次将使用方案
创建文件
miserables-#xxxx-yyyy.ext
@Echo off
Setlocal EnableDelayedExpansion
Set "Prefix=miserables"
:: Get Max png count
:: (prepend with 1 to avoid set /A interpreting leading 0 as octal)
for /f "tokens=2 delims=-." %%A in ('Dir /B %Prefix%-*.png') Do @set "Max=1%%A"
Echo Max = %Max:~1%
:: loop from 0001 step 20 to %Max%
For /l %%A in (10001,20,%Max%) Do (
Set From=%%A
Set /A To=%%A+19
If !To! gtr %Max% Set To=%Max%
Set "File=%Prefix%-#!From:~-4!-!To:~-4!"
Echo Processing !File!
Del "!File!.txt" >NUL 2>&1
For /l %%B in (!From!,1,!To!) Do (
Set _B_=%%B
>> "!File!.txt" Echo %Prefix%-!_B_:~-4!.png
)
Call Magick @!File!.txt -append !File!.png
)
我使用生成的数字图片进行测试:
谁对如何感兴趣:
:: Q:\Test\2017\09\02\GenPNGs.cmd
@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
For /l %%A in (10001,1,10205) Do (
Set "#=%%A"&Set "#=!#:~1!"
magick convert ^
-size 200x85 canvas:none -background white^
-font Courier-New -pointsize 72 ^
-draw "text 15,60 '!#!'" -channel RGBA -gaussian 0x6 ^
-fill black -stroke blue ^
-draw "text 10,55 '!#!'" ^
miserables-!#!.png
)
答案 2 :(得分:0)
如果您对bash感到满意,我建议您使用seq或其他标准实用程序。
我可以想到两种方法,但我确信其他人可以提出简化的单行。
#!/bin/bash
PREFIX="miserables-"
SUFFIX=".png"
# Get count of files
TOTAL=$(ls -l ${PREFIX}*${SUFFIX} | wc -l | bc)
# Create output cursor to increment with each 20th iteration.
CURSOR=0
# Iterate start of each 20
for START in $(seq 1 20 $TOTAL)
do
END=$(($START + 19))
FILES=""
# Collect each filename
for ITER in $(seq -f "%04g" $START $END)
do
# Build filename
FILE="${PREFIX}${ITER}${SUFFIX}"
# Double check that the file exists.
if [ -f $FILE ]; then
FILES="${FILES} ${FILE}"
fi
done
# Increment the output cursor
CURSOR=$(($CURSOR + 1))
# Write output file
convert $FILES -append output/miserables-appended-${CURSOR}.png
done
#!/bin/bash
PREFIX="miserables-"
SUFFIX=".png"
CURSOR=0;
OUTPUT_CURSOR=0;
FILES=""
# Find all files
for FILE in $(ls ${PREFIX}*${SUFFIX})
do
# Increment cursor
CURSOR=$(($CURSOR + 1))
# Append file to list
FILES="${FILES} $FILE"
# If we're on the twentieth file, create output
if [[ $(($CURSOR % 20)) -eq 0 ]]; then
# Incement output cursor
OUTPUT_CURSOR=$(($OUTPUT_CURSOR + 1))
# Write output file
convert $FILES -append output/miserables-appended-${OUTPUT_CURSOR}.png
# Reset file list
FILES=""
fi
done