Automatisches Skalieren und Labeln von Bildern – Shell und PHP

Wenn man viele Bilder auf eine Website stellen möchte, diese aber nicht zu groß (Ladezeit) und gelabelt (Copyright) sein sollen, ist es von Vorteil das Skalieren und Labeln nicht bei jedem Bild von Hand vorzunehmen.

Dazu gibt es ein (oder zwei) Programme, die das erledigen, aufzurufen ist dann nur ein Shellscript, welches jede jpg oder png Datei in einem Ordner einliest, skaliert und mit einem angegebenen Schriftzug labelt.

Funktionen der Programmteile:

“convert.sh” liest die Bilder eines Ordners ein, skaliert das Bild und ruft für jede Bilddatei “label.php” auf.

“label.php” fügt eine Beschriftung am rechten unteren Rand des Bildes ein.

Einstellungen:

  • Einstellungen zu Dateitypen, Skalierung und Dateinamen (prefix für das abspeichern der bearbeiteten Dateien – standardmäßig werden die Originaldateien überschrieben!), etc. werden in “convert.sh” vorgenommen.
  • Einstellungen zum Labeling wie Beschriftungstext, Schriftfarbe, Schriftgröße, etc. werden in “label.php” vorgenommen.

 

convert.sh

#!/bin/bash
echo ""
for i in *.png ; #change png to jpg to convert jpeg files
do

new_filename=""$i #insert prefix into ""

cp $i $new_filename;

SIZEX=$(identify $new_filename | egrep -o '[0-9]+x' | egrep -o '[0-9]+')
SIZEY=$(identify $new_filename | egrep -o 'x[0-9]+' | egrep -o '[0-9]+')
if(test $SIZEX -ge $SIZEY;)then
convert -size 640x480 $new_filename -resize 640x480 $new_filename;
else
convert -size 480x640 $new_filename -resize 480x640 $new_filename;
fi
echo "resized image $new_filename created." ;
php ./label.php $new_filename;

done

label.php

 <?php

    //    PHP-Bildverarbeitung
    //
    //    Dieser Code steht zur Benutzung auf der eigenen Website zur freien Verfügung.

    //    Originalcode:
    //    Copyright © 2008, 2009, 2010 Paul Wilhelm <paul@mosfetkiller.de>
    //    http://mosfetkiller.de/?s=phpbildverarbeitung

    //    Überarbeitung:
    //    2013 Michael Langeder <info@langeder.org>
    //    http://langeder.org

    $image_error = "images/index/notification_error.png";    //    Dateiname des Fehlersymbols
    $image_jpeg_quality = 100;                                //    JPEG-Qualitätseinstellung der Bilder
    $image_create_backup = FALSE;                        // Originalbild unter $image_filename.original abspeichern

    //    Modul: Labeling | Bild beschriften
    $image_labeling_enabled = TRUE;                            //    Bildbeschriftung aktiviert (TRUE = Ja, FALSE = Nein)
    $image_label_overwrite_original = TRUE;                    // Originalbild mit gelabelter Version überschreiben

    $image_text_label = "Labeltext hier einfügen";                //    Beschriftungstext
    $image_font_size_label = 4;                                //    Größe der Bildbeschriftung
    $image_font_color_foreground_label = "e50000";            //    Vordergrundfarbe der Bildbeschriftung
    $image_font_color_background_label = "ffffff";            //    Hintergrundfarbe der Bildbeschriftung

    //    Grundgerüst: Dateinamen ermitteln oder abbrechen (ignorieren, falls E-Mail-Adresse ausgegeben werden soll)
    if (!isset($_GET['mail']))
    {
        if (isset($_GET['bild'])) { //per Browser aufgerufen
            $image_filename = $_GET['bild']; 

        }else if($_SERVER['argc'] !== 0){ //per Commandline aufgerufen
            $image_filename = $_SERVER['argv'][1];

        }else die("Kein Parameter angegeben.");
        if($image_create_backup == TRUE) copy($image_filename, $image_filename.".original"); //Sicherung der Datei erstellen
    }

    //    Grundgerüst: Wenn die Datei nicht vorhanden ist, wird ein Fehlersymbol ausgegeben (ignorieren, falls E-Mail-Adresse ausgegeben werden soll)
    if (!isset($_GET['mail']))
    {
        if (!file_exists($image_filename))
        {
            //    Wenn sogar das Fehlersymbol fehlt, einfach abbrechen
            if (!file_exists($image_error)) die("Bilddatei und Fehlersymbol nicht vorhanden.");

            //    Fehlersymbol laden
            $image = imagecreatefrompng($image_error);

            //    Fehlersymbol ausgeben
            header("Content-type: image/png");
            imagepng($image);
            imagedestroy($image);
            exit();
        }
        else
        {
            //    Den Bildtyp anhand der Dateiendung ermitteln
            $temp = explode(".", $image_filename);
            $image_ext = $temp[count($temp) - 1];

            //    Das Bild laden
            switch ($image_ext)
            {
                case "jpg": 
                    $image_mime = "jpeg"; $image = imagecreatefromjpeg($image_filename);
                    break;
                case "png": 
                    $image_mime = "png"; $image = imagecreatefrompng($image_filename); 
                    break;
            }
        }
    }

    //    Modul: Labeling | Bild beschriften
    if (!isset($_GET['mail']) && $image_labeling_enabled && $image_text_label !== "")
    {
        //    Vordergrundfarbe setzen
        $_image_font_color_foreground_label = imagecolorallocate($image,
            hexdec(substr($image_font_color_foreground_label, 0, 2)),
            hexdec(substr($image_font_color_foreground_label, 2, 2)),
            hexdec(substr($image_font_color_foreground_label, 4, 2)));

        //    Hintergrundfarbe setzen
        $_image_font_color_background_label = imagecolorallocate($image,
            hexdec(substr($image_font_color_background_label, 0, 2)),
            hexdec(substr($image_font_color_background_label, 2, 2)),
            hexdec(substr($image_font_color_background_label, 4, 2)));

        //    Größe des Schriftzugs berechnen
        $image_text_label_width = strlen($image_text_label) * imagefontwidth($image_font_size_label);
        $image_text_label_height = imagefontheight($image_font_size_label);

        //    Position des Schriftzugs berechnen
        $image_text_label_x = imagesx($image) - $image_text_label_width - 3;
        $image_text_label_y = imagesy($image) - $image_text_label_height - 2;

        //    Silhouette des Schriftzugs in der Hintergrundfarbe zeichnen
        imagestring($image, $image_font_size_label, $image_text_label_x + 1, $image_text_label_y, $image_text_label, $_image_font_color_background_label);
        imagestring($image, $image_font_size_label, $image_text_label_x + 1, $image_text_label_y + 1, $image_text_label, $_image_font_color_background_label);
        imagestring($image, $image_font_size_label, $image_text_label_x, $image_text_label_y + 1, $image_text_label, $_image_font_color_background_label);
        imagestring($image, $image_font_size_label, $image_text_label_x - 1, $image_text_label_y + 1, $image_text_label, $_image_font_color_background_label);
        imagestring($image, $image_font_size_label, $image_text_label_x - 1, $image_text_label_y, $image_text_label, $_image_font_color_background_label);
        imagestring($image, $image_font_size_label, $image_text_label_x - 1, $image_text_label_y - 1, $image_text_label, $_image_font_color_background_label);
        imagestring($image, $image_font_size_label, $image_text_label_x, $image_text_label_y - 1, $image_text_label, $_image_font_color_background_label);

        //    Schriftzug in der Vordergrundfarbe zeichnen
        imagestring($image, $image_font_size_label, $image_text_label_x, $image_text_label_y, $image_text_label, $_image_font_color_foreground_label);
    }

    //    Grundgerüst: Bild ausgeben
    header("Content-type: image/".$image_mime);

    switch ($image_mime)
    {
        case "jpeg": 
            if($_SERVER['argc'] == 0) imagejpeg($image, "", $image_jpeg_quality); //output picture to STDOUT
            if($image_label_overwrite_original == TRUE) imagejpeg($image, $image_filename, $image_jpeg_quality);
            break;
        case "png": 
            if($_SERVER['argc'] == 0) imagepng($image);    //output picture to STDOUT
            if($image_label_overwrite_original == TRUE)imagepng($image, $image_filename);
            break;
    }

    imagedestroy($image);
    exit();

?>

 

 

 

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: