Numbering/Labeling 图像(例如 1、2、3 或 A、B、C)与 ImageMagick 蒙太奇
Numbering/Labeling images (eg 1,2,3 or A,B,C) with ImageMagick montage
我正在使用
montage *.tif output.tif
将多张图片合二为一。我现在希望对它们进行编号(有时是 1、2、3 ……;有时是 A、B、C ……)
有什么可能性可以标记组合中的单个图像?是否可以选择将标签不放在图片下方,而是放在左上角或右下角?
不幸的是,我真的不知道如何使用 -label 命令来实现它。感谢您的任何建议。
What possibilities are there to label the single images in the combined?
使用 for 循环进行迭代。
for INDEX in {A,B,C}; do
convert ${INDEX}.jpg labeled_${INDEX}.jpg
done
Is there an option to put the label not underneath the picture but eg in the upper left or lower right corner?
convert rose: -fill white \
-gravity NorthWest -annotate +0+0 "A" \
A.png
convert rose: -fill white \
-gravity SouthEast -annotate +0+0 "B" \
B.png
如果你想投入更多的努力,你可以拥有更多的控制权。如果你这样做,你可以在剪辑图像时标记图像 "on-the-fly" 而不必将它们全部保存标记然后再剪辑它们。您还可以根据每行的图像数量更轻松地控制宽度:
#!/bin/bash
number=0
for f in *.tif; do
convert "$f" -gravity northwest -annotate +0+0 "$number" miff:-
((number++))
done | montage -tile x3 - result.png
它利用 ImageMagick miff
格式,即多图像文件格式,连接所有输出图像并将它们发送到 montage
命令的 stdin
。
或者,您可以像这样更改脚本:
#!/bin/bash
number=0
for f in *.tif; do
convert "$f" -gravity northwest -fill white -annotate +0+0 "$number" miff:-
((number++))
done | montage -tile 2x - result.png
获得
或者也许这个...
#!/bin/bash
number=0
for f in *.tif; do
convert "$f" -gravity northwest -background gray90 label:"$number" -composite miff:-
((number++))
done | montage -tile 2x - result.png
或者用字母...
#!/bin/bash
number=0
letters="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for f in *.tif; do
label=${letters:number:1}
convert "$f" -gravity northwest -background gray90 label:"$label" -composite miff:-
((number++))
done | montage -tile 2x - result.png
根据上面的回答,我写了一个小的 perl 脚本来将图形组合成带标签的子图,这可能对其他人有用。它适用于 Mac,但我没有真正测试它。
Usage: pics2grid geometry output_file [-title title] [-bycols] input_files
其中几何格式为 [#cols]x[#rows] 且 input_files 接受通配符。如果您的标题包含空格,则标题必须用引号 和 转义的空格。
我贴在下面,不过也可以从http://endress.org/progs.html#subfigs
下载
#!/usr/bin/perl -l
use strict;
use warnings;
use autodie;
use Getopt::Long 'HelpMessage';
### Process options and arguments ###
if (@ARGV < 3){
HelpMessage(1);
}
if (($ARGV[0] !~ /^\d+x/) && ($ARGV[0] !~ /x\d+$/)){
HelpMessage(1);
}
my $geometry = shift @ARGV;
my $output_file = shift @ARGV;
my $title = "";
my $bycols = "";
GetOptions ('bycols' => $bycols,
'title=s' => $title,
'help' => sub { HelpMessage() },
) or HelpMessage(1);
# Wildcards are automatically expanded in @ARGV, but just make sure that they are
my @input_files = map { glob } @ARGV;
$title = "-title $title"
if ($title);
if ($bycols){
die "When option -bycols is set, a fully specified geometry is needed."
unless ($geometry =~ /^\d+x\d+$/);
}
@input_files = reorder_input_files (\@input_files, $geometry)
if ($bycols);
### Define the labels for the subfigures. If you want different figures, change it here. ###
my @labels = "a".."z";
@labels = @labels[0..$#input_files];
@labels = reorder_input_files (\@labels, $geometry)
if ($bycols);
my $pic_data;
foreach my $f (@input_files){
# Pictures are combined by rows
my $lab = shift @labels;
$pic_data .= `convert \"$f\" -pointsize 48 -font Arial-Regular -gravity northwest -annotate +20+10 \'$lab\' \
-bordercolor black -border 1 \
miff:-`;
}
open (OUT, "| montage -tile $geometry -geometry +0+0 -background white -pointsize 60 -font Arial-Regular $title - $output_file");
print OUT $pic_data;
close (OUT);
sub reorder_input_files {
my ($input_files, $geometry) = @_;
my ($ncols, $nrows) = split (/x/, $geometry);
my @rows = ([]) x $nrows;
foreach my $i (0..$#$input_files){
my @tmp_array = @{$rows[$i % $nrows]};
push (@tmp_array, $input_files->[$i]);
$rows[$i % $nrows] = \@tmp_array;
}
my @reordered_files = ();
map {push (@reordered_files, @$_)} @rows;
return (@reordered_files);
}
=head1 NAME
pics2grid - arrange pictures on a grid of sub-figures and number the individual pictures with letters
=head1 SYNOPSIS
pics2grid geometry output [-title title] [-bycols] inputfiles
The inputfiles argument accepts wild cards.
Geometry format: [\# cols]x[\# rows].
Unless you set the option -bycols, specifying either
the number of rows or of columns is sufficient.
Options:
--title,-t Title. If your title contains spaces, the title needs
to be quoted *and* the spaces need to be escaped.
--bycols,-b Arrange and number pictures by columns rather than rows
--geometry,-g Not yet implemented
--help,-h Print this help message
Examples:
# Create grid with 3 columns and 2 rows in which images are arranged by *rows*
pics2grid.pl 3x2 output.pdf input1.png input2.png input3.png\
input4.png input5.png input6.png
# Create grid with 2 columns and 3 rows in which images are arranged by *columns*
pics2grid.pl 2x3 output.pdf -bycols input1.png input2.png input3.png\
input4.png input5.png input6.png
# Same as above but with a title including spaces.
# Note that the title needs to be quoted *and* the space needs to be escaped
# (i.e., put \ in front of the space)
pics2grid.pl 2x3 output.pdf -bycols -title "My\ title" input1.png\
input2.png input3.png input4.png input5.png input6.png
# Create grid with 4 columns of all png files in the current directory. Images
# are arranged by *columns*.
# It will stop labeling the subfigures for more than 26 images
pics2grid.pl 4x output.pdf *.png
=head1 VERSION
0.01
=cut
我正在使用
montage *.tif output.tif
将多张图片合二为一。我现在希望对它们进行编号(有时是 1、2、3 ……;有时是 A、B、C ……) 有什么可能性可以标记组合中的单个图像?是否可以选择将标签不放在图片下方,而是放在左上角或右下角?
不幸的是,我真的不知道如何使用 -label 命令来实现它。感谢您的任何建议。
What possibilities are there to label the single images in the combined?
使用 for 循环进行迭代。
for INDEX in {A,B,C}; do
convert ${INDEX}.jpg labeled_${INDEX}.jpg
done
Is there an option to put the label not underneath the picture but eg in the upper left or lower right corner?
convert rose: -fill white \
-gravity NorthWest -annotate +0+0 "A" \
A.png
convert rose: -fill white \
-gravity SouthEast -annotate +0+0 "B" \
B.png
如果你想投入更多的努力,你可以拥有更多的控制权。如果你这样做,你可以在剪辑图像时标记图像 "on-the-fly" 而不必将它们全部保存标记然后再剪辑它们。您还可以根据每行的图像数量更轻松地控制宽度:
#!/bin/bash
number=0
for f in *.tif; do
convert "$f" -gravity northwest -annotate +0+0 "$number" miff:-
((number++))
done | montage -tile x3 - result.png
它利用 ImageMagick miff
格式,即多图像文件格式,连接所有输出图像并将它们发送到 montage
命令的 stdin
。
或者,您可以像这样更改脚本:
#!/bin/bash
number=0
for f in *.tif; do
convert "$f" -gravity northwest -fill white -annotate +0+0 "$number" miff:-
((number++))
done | montage -tile 2x - result.png
获得
或者也许这个...
#!/bin/bash
number=0
for f in *.tif; do
convert "$f" -gravity northwest -background gray90 label:"$number" -composite miff:-
((number++))
done | montage -tile 2x - result.png
或者用字母...
#!/bin/bash
number=0
letters="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for f in *.tif; do
label=${letters:number:1}
convert "$f" -gravity northwest -background gray90 label:"$label" -composite miff:-
((number++))
done | montage -tile 2x - result.png
根据上面的回答,我写了一个小的 perl 脚本来将图形组合成带标签的子图,这可能对其他人有用。它适用于 Mac,但我没有真正测试它。
Usage: pics2grid geometry output_file [-title title] [-bycols] input_files
其中几何格式为 [#cols]x[#rows] 且 input_files 接受通配符。如果您的标题包含空格,则标题必须用引号 和 转义的空格。
我贴在下面,不过也可以从http://endress.org/progs.html#subfigs
下载#!/usr/bin/perl -l
use strict;
use warnings;
use autodie;
use Getopt::Long 'HelpMessage';
### Process options and arguments ###
if (@ARGV < 3){
HelpMessage(1);
}
if (($ARGV[0] !~ /^\d+x/) && ($ARGV[0] !~ /x\d+$/)){
HelpMessage(1);
}
my $geometry = shift @ARGV;
my $output_file = shift @ARGV;
my $title = "";
my $bycols = "";
GetOptions ('bycols' => $bycols,
'title=s' => $title,
'help' => sub { HelpMessage() },
) or HelpMessage(1);
# Wildcards are automatically expanded in @ARGV, but just make sure that they are
my @input_files = map { glob } @ARGV;
$title = "-title $title"
if ($title);
if ($bycols){
die "When option -bycols is set, a fully specified geometry is needed."
unless ($geometry =~ /^\d+x\d+$/);
}
@input_files = reorder_input_files (\@input_files, $geometry)
if ($bycols);
### Define the labels for the subfigures. If you want different figures, change it here. ###
my @labels = "a".."z";
@labels = @labels[0..$#input_files];
@labels = reorder_input_files (\@labels, $geometry)
if ($bycols);
my $pic_data;
foreach my $f (@input_files){
# Pictures are combined by rows
my $lab = shift @labels;
$pic_data .= `convert \"$f\" -pointsize 48 -font Arial-Regular -gravity northwest -annotate +20+10 \'$lab\' \
-bordercolor black -border 1 \
miff:-`;
}
open (OUT, "| montage -tile $geometry -geometry +0+0 -background white -pointsize 60 -font Arial-Regular $title - $output_file");
print OUT $pic_data;
close (OUT);
sub reorder_input_files {
my ($input_files, $geometry) = @_;
my ($ncols, $nrows) = split (/x/, $geometry);
my @rows = ([]) x $nrows;
foreach my $i (0..$#$input_files){
my @tmp_array = @{$rows[$i % $nrows]};
push (@tmp_array, $input_files->[$i]);
$rows[$i % $nrows] = \@tmp_array;
}
my @reordered_files = ();
map {push (@reordered_files, @$_)} @rows;
return (@reordered_files);
}
=head1 NAME
pics2grid - arrange pictures on a grid of sub-figures and number the individual pictures with letters
=head1 SYNOPSIS
pics2grid geometry output [-title title] [-bycols] inputfiles
The inputfiles argument accepts wild cards.
Geometry format: [\# cols]x[\# rows].
Unless you set the option -bycols, specifying either
the number of rows or of columns is sufficient.
Options:
--title,-t Title. If your title contains spaces, the title needs
to be quoted *and* the spaces need to be escaped.
--bycols,-b Arrange and number pictures by columns rather than rows
--geometry,-g Not yet implemented
--help,-h Print this help message
Examples:
# Create grid with 3 columns and 2 rows in which images are arranged by *rows*
pics2grid.pl 3x2 output.pdf input1.png input2.png input3.png\
input4.png input5.png input6.png
# Create grid with 2 columns and 3 rows in which images are arranged by *columns*
pics2grid.pl 2x3 output.pdf -bycols input1.png input2.png input3.png\
input4.png input5.png input6.png
# Same as above but with a title including spaces.
# Note that the title needs to be quoted *and* the space needs to be escaped
# (i.e., put \ in front of the space)
pics2grid.pl 2x3 output.pdf -bycols -title "My\ title" input1.png\
input2.png input3.png input4.png input5.png input6.png
# Create grid with 4 columns of all png files in the current directory. Images
# are arranged by *columns*.
# It will stop labeling the subfigures for more than 26 images
pics2grid.pl 4x output.pdf *.png
=head1 VERSION
0.01
=cut