簡體   English   中英

使用 ImageMagick 蒙太奇編號/標記圖像(例如 1、2、3 或 A、B、C)

[英]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 命令來實現這一目標。 感謝您的任何建議。

如果你想投入更多的努力,你可以擁有更多的控制權。 如果您這樣做,您可以蒙太奇時“即時”標記圖像而不必保存所有標記然后蒙太奇。 您還可以更輕松地控制每行圖像數量的寬度:

#!/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

在此處輸入圖片說明

有什么可能性可以在組合中標記單個圖像?

使用for循環進行迭代。

for INDEX in {A,B,C}; do
    convert ${INDEX}.jpg labeled_${INDEX}.jpg
done

是否可以選擇不將標簽放在圖片下方,而是將標簽放在左上角或右下角?

嘗試使用-annotate-gravity

convert rose: -fill white \
        -gravity NorthWest -annotate +0+0 "A" \
        A.png

一朵玫瑰

convert rose: -fill white \
        -gravity SouthEast -annotate +0+0 "B" \
        B.png

玫瑰B

根據上面的答案,我編寫了一個小的 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM