Thread [Image::Magick] Rahmen um Text (12 answers)
Opened by GUIfreund at 2013-10-13 19:01

GUIfreund
 2013-10-23 17:49
#171440 #171440
User since
2011-08-08
559 Artikel
BenutzerIn
[default_avatar]
Hier ist nun wie versprochen das Resultat meiner Bemühungen. Künftige Generationen mögen es mir danken.
more (17.8kb):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# Füge Text vor rechteckigem Hintergrund in ein Bild ein
#   img_addtext($img, $text, $opt_ref);
#         $img       Bildobjekt, Ziel für den Text
#         $text      Textstring
#         $opt_ref   Ref auf Hash mit Optionen für Annotate
#   Für x- und y-Position, Textgröße und Hintergrundfarbe
#   werden Defaultwerte gesetzt
#
sub img_addtext {
    my ($img, $text, $opt_ref) = @_;

    my $err;

    # set option defaults
    exists $opt_ref->{x}  or  $opt_ref->{x} = 0;
    exists $opt_ref->{y}  or  $opt_ref->{y} = 0;
    exists $opt_ref->{pointsize}  or  $opt_ref->{pointsize} = 30;
    exists $$opt_ref{undercolor}  or  $$opt_ref{undercolor} = 'white';

    chomp $text;

    unless ($text =~ /\n/) {
        # single line text
        $err = $img->Annotate(text => $text, %$opt_ref);
        die "$err" if "$err";
        return;
    };

    # multiline text
    my $textimg = mulitext($text, $opt_ref);
    my ($w, $h) = $textimg->Get('width', 'height');
    $err = $img->Composite(image => $textimg, compose => 'Over', 
                           x => $opt_ref->{x}, y => $opt_ref->{y},
                          );
    die "$err" if "$err";
    return;
}

# Erzeuge Bild mit mehrzeiligem Text vor rechteckigem Hintergrund
#   my $txtimg = mulitext($text, $opt_ref);
#         $text      Textstring
#         $opt_ref   Ref auf Hash mit Optionen für Annotate
#         $txtimg    Erzeugtes Bildobjekt
#
sub mulitext {
    my ($text, $opt_ref) = @_;

    my $err;
    my @numlines = $text =~ /\n/g;
    my $numlines = @numlines + 1;

    # Objekt für Textbild erzeugen
    my $textimg = Image::Magick->new();

    # Bildgröße setzen
    # Werte sind willkürlich, begrenzen aber die Größe der Textgrafik
    $textimg->Set(size=>'1200x900');

    # Bild mit Backgroundfarbe erzeugen
    $err = $textimg->ReadImage("xc:$opt_ref->{undercolor}");
    die "$err" if "$err";
    # Text erzeugen
    $err = $textimg->Annotate(text => $text, %$opt_ref);
    die "$err" if "$err";
    # Bild verkleinern
    $err = $textimg->Trim();
    die "$err" if "$err";
    # Freiraum um den Text hinzu
    my $bordersize = $opt_ref->{pointsize}/3;
    $err = $textimg->Border(fill => "$opt_ref->{undercolor}",
                            width => $bordersize, height => $bordersize,
                           );
    die "$err" if "$err";
    return $textimg;
}
Gruß
GUIfreund

View full thread [Image::Magick] Rahmen um Text