Open Source im professionellen Einsatz
Linux-Magazin 11/2013
© FreyaSapphire, photocase.com

© FreyaSapphire, photocase.com

Nicht nur für die Katz: Perl-maschinell erzeugte Memes

Catwalk Orange

Was harmlos mit ein paar sonderbaren Katzenbildern begann, ist zu dem Internetphänomen schlechthin angeschwollen: Memes, mit Witztexten versehene Fotos, und animierte Gag-Gifs. Kein Witz: Mit Perl lassen die sich prima selbst bauen und individuell gestalten.

985

Sommerzeit, Praktikantenzeit: Wie immer über die Sommermonate beschäftigt mein Arbeitgeber Collegestudenten, und wir Altgediegenen kratzen uns die kahler werdenden Schädel ob des sonderbaren akademischen Nachwuchses. Besonders erstaunte in diesem Jahr der praktizierte Praktikantenhumor: Jede Präsentation zieren so genannte Image Macros [2] zum Zwecke der Erheiterung, entweder als statische Fotos oder als per Endlosschleife animierte Gifs.

Was als "I Can Has Cheezburger" [3] mit knuddeligen Kätzchen – den so genannten Lolcats – und kessen Sprüchen begann, ist heute als "Meme" fester Bestandteil der netzweiten Humorkultur. Man nehme ein ausdrucksstarkes Bild und lege einen orthografisch oder grammatikalisch jenseitigen Spruch (Lolspeak) als Kopf- und Fußzeile im Font Impact darüber – und fertig ist der Witz (Abbildung 2).

Meme oder Mem kommt aus dem Griechischen, "mimema" meint dort etwas Imitiertes, und die evolutionäre Biologie beschreibt damit den Vorgang der sozialen Weitergabe kultureller Werte. Im Internet schließlich sind Memes ein sich per Mail, Chat oder soziale Netze virenartig verbreitendes Massenphänomen (Abbildung 3).

Abbildung 1: Auf der Kommandozeile per meme-first erzeugter Zeitgeist-Witz.
© © Niccolò CapantiAbbildung 2: Klassiker der Moderne – eine Lolcat mit orthografisch bedenklichem Lolspeak.
© © Sarah CharlesworthAbbildung 3: Knorpelfisch mit Haus – typisches Beispiel eines Image-Macro-Mem.

Maschinell statt manuell

Mit einem Grafikprogramm wie Gimp sind Image Macros auf konventionelle Weise recht schnell angefertigt, aber mit einem Perl-Skript geht es sogar von der Kommandozeile aus. Listing 1 zeigt die einfachste Version, die nur vorher ausgemessene Koordinaten für die Textstrings hart verdrahtet. Das CPAN-Modul Imager liest die Originaldatei »turtle.jpg« ein, das von mir persönlich auf Hawaii geschossene Urlaubsfoto von einer schwimmenden Riesenschildkröte.

Den Font Impact fand ich in meiner Ubuntu-Distribution als ».ttf« -Datei unter dem in Listing 1 (Zeilen 10 und 11) angegebenen Pfad. Zweimal die Methode »string()« aufgerufen, einmal mit der Fuß- und einmal mit der Kopfzeile, die Farbe mit »white« und die Fontgröße auf 60 angegeben, Anti-Aliasing für schwachbrüstige Displays eingeschaltet und die Ausgabedatei mit »write()« geschrieben – fertig ist der Spitzenwitz (Abbildung 1).

Listing 1

meme-first

01 #!/usr/local/bin/perl -w
02 use strict;
03 use Imager;
04
05 my $img = Imager->new(
06     file => "turtle.jpg" ) or
07   die Imager->errstr();
08
09 my $font = Imager::Font->new( file =>
10   "/usr/share/fonts/truetype" .
11   "/msttcorefonts/Impact.ttf" );
12
13 $img->string( x => 337, y => 102,
14               string => "ARRIVING FIRST",
15               font => $font, size => 60,
16               aa => 1, color => 'white' );
17
18 $img->string( x => 315, y => 600,
19               string => "SO NOT WORTH IT.",
20               font => $font, size => 60,
21               aa => 1, color => 'white' );
22
23 $img->write( file => "turtle-meme.jpg" );

Variabler Komfort

Für variable Textstrings muss das Skript diese dynamisch in der Mitte positionieren. Listing 2 nimmt drei Parameter entgegen – das zu modifizierende Bild, die Kopf- und die Fußzeile – und macht daraus ein Image Macro. Der Aufruf

meme-simple turtle.jpg "ARRIVING FIRST""SO NOT WORTH IT."

erzeugt die Datei »turtle-meme.jpg« . Hierzu definiert das Skript einen vertikalen Abstand »$margin_y« von der Bildoberkante zur Kopfzeile respektive von der Bildunterkante zur Fußzeile. Die ab Zeile 56 definierte Funktion »dimensions« errechnet Breite und Höhe des mit dem Impact-Font der Größe 60 erzeugten Strings. Hierzu benutzt es die Methode »bounding_box()« eines Objekts vom Typ Imager::Font und übergibt ihm den gewünschten String.

Zurück kommen Breite und Höhe in Pixeln, nachdem die Funktion die unter Umständen negative Koordinate des linken Rands des ersten Glyphen im String (»$neg_width« ) von der Position am rechten Ende des Strings (»$pos_width)« subtrahiert hat. Analog verfährt sie mit der Position am oberen (»$asc« ) beziehungsweise unteren (»desc« ) Rand des Strings. Die Werte »$global_asc« und »$global_desc« spielen keine Rolle, da sie sich nicht auf den aktuellen String, sondern auf maximal mögliche Ausmaße beliebiger Glyphen beziehen.

Die Zeilen 33 und 36 zentrieren dann Fuß- und Kopfzeile jeweils in der Mitte des Fotos, indem sie die mit »getwidth()« geholte Gesamtbreite des Fotos halbieren und die Hälfte der Stringbreite davon subtrahieren. Heraus kommt jeweils die erforderliche Anfangskoordinate des zentrierten Strings als xy-Wertepaar, x läuft dabei von links nach rechts im Bild, y von oben nach unten.

Wie in Listing 1 fügt in Listing 2 die Methode »string()« nun die beiden Textstrings im vorgegebenen Font in das Bild ein und die Methode »write()« schreibt das Ergebnis in eine um »-meme« am Ende erweiterte Datei auf die Festplatte.

Listing 2

meme-simple

01 #!/usr/local/bin/perl -w
02 use strict;
03 use Imager;
04
05 my $margin_y   = 100;
06 my $font_size  = 60;
07 my $font_color = "white";
08
09 my( $file, $header, $footer ) = @ARGV;
10
11 die "usage: file header footer"
12   if scalar @ARGV != 3;
13
14 my $img = Imager->new(
15   file => $file ) or
16   die Imager->errstr();
17
18 my $font = Imager::Font->new(
19   file =>
20     "/usr/share/fonts/truetype/" .
21     "msttcorefonts/Impact.ttf",
22   size  => $font_size,
23   color => $font_color,
24 );
25
26 my( $header_w, $header_h ) =
27   dimensions( $font, $header );
28
29 my( $footer_w, $footer_h ) =
30   dimensions( $font, $footer );
31
32 my $footer_x =
33   ( $img->getwidth() - $footer_w ) / 2;
34
35 my $header_x =
36   ( $img->getwidth() - $header_w ) / 2;
37
38 $img->string(
39   x => $header_x, y => $margin_y,
40   string => $header,
41   font => $font, size => $font_size,
42   aa => 1, color => $font_color );
43
44 $img->string(
45   x => $footer_x,
46   y => $img->getheight() -
47        $margin_y + $footer_h,
48   string => $footer,
49   font => $font, size => $font_size,
50   aa => 1, color => $font_color );
51
52 ( my $outfile = $file ) =~ s/\./-meme./;
53 $img->write( file => $outfile );
54
55 ###########################################
56 sub dimensions {
57 ###########################################
58   my( $font, $string ) = @_;
59
60   my( $neg_width, $global_desc,
61       $pos_width, $global_asc,
62       $desc, $asc,
63     ) = $font->bounding_box(
64         string => $string );
65
66     return $pos_width - $neg_width,
67            $asc - $desc;
68 }

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Der Screencast zum Perl-Snapshot Linux-Magazin 11/2013

    Perl-maschinell erzeugte Memes: Was harmlos mit ein paar sonderbaren Katzenbildern begann, ist zu dem Internetphänomen schlechthin angeschwollen: Memes, mit Witztexten versehene Fotos, und animierte Gag-Gifs. Kein Witz: Mit Perl lassen die sich prima selbst bauen und individuell gestalten.

  • Final Cut

    Ein handgedrehtes Video sieht mit einem Vorspann gleich professioneller aus. Die Tools Mencoder und Sox helfen bei der Formatfitzelei und ein Perl-Skript automatisiert den Vorgang.

  • Java-Akrobatik

    PDF-Dateien selbst schreiben ist mit freier Software kein Problem. Wer mit Java ein PDF erzeugen möchte, muss nicht mal zu externen Programmen greifen: Das freie Projekt I-Text bietet alles, was dafür notwendig ist. Die neueste Version unterstützt auch XML-Formate.

  • Runter kommen sie alle

    Spiele-Programmierer rechnen mit physikalischen Formeln und setzen spezielle Tricks ein, um Grafiken realitätsnah zu animieren. Der als Perl-Wrapper verfügbare Simple Direct Media Layer (SDL) bietet ein leistungsfähiges Framework, um einfache 2D-Welten zu schaffen, hier eine Fallschirmsprung-Simulation.

  • Perl-Snapshot

    Etiketten bringen Ordnung in den Kabelverhau am Heim-Router und helfen beim Zuordnen von in Kisten gelagertem Plunder. Mit einigen Handgriffen druckt Michael Schillis Labelwriter sogar unter Linux.

comments powered by Disqus

Ausgabe 10/2016

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.