photomappe.de

Mit Python-Fu in Gimp ein Kalendarium erstellen

Wer schon mal mit Gimp versucht hat ein Kalendarium zu erstellen ist bestimmt an der mangelhaften Textausrichtung verzweifelt. Ein proportionaler Zeichensatz macht es sehr schwer die Spalten eines Kalenders sauber untereinander auszurichten.
Die Spalten einzeln einzugeben macht die Aufgabe nicht einfacher. Auch fehlt die Möglichkeit einzelnen Zeichen eines Textes eine andere Farbe zu geben, so müssen ggf. einzelne Tage doppelt eingegeben werden.

Zum Glück gibt es Python in Gimp...

Kalender mit Python erstellen

Python kommt mit zahlreichen Funktionen zur Datumsrechnerei und auch einer Klasse für Kalender (ab Version 2.5)

import calendar
year = 2011
month = 10
calendar.monthcalendar(year, month)

liefert ein Liste mit den einzelnen Wochen des Monats als Liste:

[[0, 0, 0, 0, 0, 1, 2], [3, 4, 5, 6, 7, 8, 9],[...

Null steht in den Listen als Platzhalter für nicht zum Monat gehörende Tage.

Zu Beachten ist das evtl. der erste Wochentag nicht richtig gesetzt ist. Für einen Kalender habe ich gerne den Montag als ersten Tag der Woche:

calendar.setfirstweekday(calendar.MONDAY)

Um die Ausgabe von calendar.monthcalendar kann man nun zwei Schleifen bauen um die einzelnen Wochen und Tage zu durchlaufen.

for week in calendar.monthcalendar(year, month):
    wd = 0
    for day in week:
        if day != 0:
            # do something...
        wd += 1

Text ausgeben in Gimp

Text wird in Gimp immer in ein neues Layer ausgegeben. Dies erkennt man schon am Namen der Funktion: gimp_text_layer_new, diese liefert einen Bezeichner für den neu erzeugten Layer.
Dieser Layer muss einem Bild hinzugefügt werden.

    layer = pdb.gimp_text_layer_new(image, day, font, height, 0)
    pdb.gimp_image_add_layer(image, layer, -1)
    pdb.gimp_text_layer_set_color(layer, color)

Die Farbe eines Textlayers kann erst gesetzt werden nachdem der Layer zu einem Bild hinzugefügt wurde!

Anschliessend können die Werte für Höhe und Breite des neuen Layer ermittelt werden (diese Werte werden später zur korrekten Positionierung im Bild benötigt).

    new_drawable = pdb.gimp_image_get_active_drawable(image)
    dwidth = pdb.gimp_drawable_width(new_drawable)
    dheight = pdb.gimp_drawable_height(new_drawable)

Beim Erzeugen der Text-Layer werden diese in der oberen linken Ecke des Bildes positioniert. Das macht nichts da sowieso erst die maximale Breite und Höhe über alle Layer ermittelt werden muss.

Für jedes Datum/jeden Tag wird die Referenz auf den Layer, der Wochentag sowie Höhe und Breite gespeichert.

Ausrichten des Textes nach Spalten

Nachdem alle Werte vorliegen werden einfach alle Layer an die entsprechende Position in der Zeile verschoben. Dafür kommt die Funktion gimp_layer_set_offsets zum Einsatz. Diese Funktion setzt einen neuen Wert für die linke obere Ecke des Layers.

Die Position ergibt sich aus dem Wochentag multipliziert mit der maximalen Text-/Layerbreite. Damit der Text nicht zu gequetscht aussieht wird auf das Maximum ein kleiner Offset addiert.

Für den Montag (Wochentag Null) würde der Text dann im linken Bildrand liegen. Daher wird noch einmal die maximale Layerbreite addiert und die tatsächliche Layerbreite abgezogen. Das ergibt rechtsbündig ausgerichtete Spalten.

Das gesamte Script gibt es hier.

Feiertage berechnen

Das Script enthält schon etwas Code um Feiertage zu berücksichtigen. Da diese immer individuell sind ist der Code nicht enthalten.
Wenn ein Feiertag kein festes Datum hat so ist er meist relativ zum Ostersonntag bestimmt. Also muss man nur den Ostersonntag in einem Jahr berechnen...