aktuelle Webcambild mit festem Namen und mit eigenem Logo

Ich habe mir ein PHP Script gebastelt, um das aktuelle Webcambild (mit festem Dateinamen) anzeigen zu lassen. Meine Bilder sind nach Datum auf dem FTP Server abgespeichert. Das funktioniert soweit Dank guter Beispiele hier im Forum.

Nun möchte ich auf dem Webcambild ein Logo einbinden. Das soll jedoch NICHT einfach mit HTML über das Bild gelegt werden, sondern soll fest in das Bild als Grafik eingebunden sein. Wie kann ich das machen???

Hier mein aktueller PHP-Code:

<?php

$_folder_name = "webcam"; // Ordnername fuer Webcambilder
$_name_last_picture = "webcambild.jpg"; // fester Name fuer aktuelles Webcambild
$_script_path_separator = "contao"; // Trenner um Speicherpfad webcambilder aus Scriptpfad zu ermitteln

$path = strstr($_SERVER['SCRIPT_FILENAME'], $_script_path_separator, true); // Pfad Webcambilder aus Scriptpfad bilden
$heute = date("Ymd"); // Datumstring für heute festlegen

// Pfad für das aktuelle Webcambild auf dem FTP Server zusammensetzen
$bild = $path . $_folder_name . "/" . $heute . "/" . "images" . "/" . $_name_last_picture ;

header("Content-type: image/jpg"); // nun sagen wir dem Browser, dass er eine JPG-Datei erhält
readfile($bild); // nun gibt PHP die Datei als JPG an den Browser

?>

Hier mein PHP Script mit dem ich mein Webcambild mit einem eigenen Text und einem Logo versehe:

<?php
// aktuellstes Webcambild einer INSTAR Kamera aus einem Ordner ermitteln, mit einem Logo 
// versehen und dem Browser als JPG übergeben
//
// hier die eigenen Parameter einstellen
$_folder_name = "/scheuermatthof_de/webcambilder/scheuermattwiese"; // Ordnername fuer die Webcambilder mit Datum Unterordner, ausgehend vom Root Verzeichnis
// $_fixed_filename = "scheuermattwiese.jpg"; // falls Verwendung eines fixen Dateinamens fuer aktuelles Webcambild
$_fixed_filename = false;  // false wenn die neuste Datei gesucht werden soll, ansonst den festen Dateinamen angeben
$_logo_path = "/scheuermatthof_de/contao/webcam"; // Pfad zum Logo
$_logo_name = "scheuermatthof-300.jpg"; // Dateiname des Logos im JPG Format
// $_logo_name = false; // false setzten, wenn kein Logo auf Bild soll, ansonsten Dateinamen angeben
$_text = "Buchung & Infos unter www.scheuermatthof.de"; // Text der oben mittig aufs Bild soll
// $_text = false; // false setzten, wenn kein Text aufs Bild soll


// hier geht es mit dem Verarbeiten los - keine Änderungen danach durchführen
$logo = $_SERVER['DOCUMENT_ROOT'] . $_logo_path . "/" . $_logo_name ;

// festen Dateinamen benutzten oder die neuste Datei ermitteln
if ($fixed_filename) { // fester Dateiname für aktuellstes Bild des Tages auswählen
    $bild = $_SERVER['DOCUMENT_ROOT'] . $_folder_name . "/" . date("Ymd") . "/images/" . $_fixed_filename ;
} else {     // neuste Datei im Ordner finden
    $dir  = $_SERVER['DOCUMENT_ROOT'] . $_folder_name . "/" . date("Ymd") . "/images/";
    $images = glob($dir . "*.jpg");
    rsort($images);
    // ACHTUNG: es wird nach den Dateinamen absteigend sortiert. D.h bei Instar fangen alle geplanten
    // Aufnahmen mit dem Buchstaben P an. Wenn sich eine sonstige Datei mit einem Buchstaben nach dem P 
    // in dem Ordner befindet wird diese Datei ausgegeben!
    $bild = $images[0];
}

$dest = imagecreatefromjpeg($bild);

// Logo mit Bild verschmelzen oder nicht?
if ($_logo_name) {
    // Bilder für Mergefunktion vorbereiten
    $logofile = imagecreatefromjpeg($logo);
    imagecopymerge($dest, $logofile, 1610, 907, 0, 0, 300, 163, 75);     // Bild mit Logo verschmelzen
    // hier eventuell Position und Größe des Logos anpassen !!!
};

// Text aufs Bild?
if ($_text) {
    $im = imagecreatetruecolor(600, 40);    // Bildfläche für Text erzeugen
    $white = imagecolorallocate($dest, 255, 255, 255);
    $black = imagecolorallocate($dest, 0, 0, 0);
    imagefilledrectangle($im, 0, 0, 600, 40, $black);  // Bildfläche mit Rechteck füllen
    $font = $_SERVER["DOCUMENT_ROOT"] . "/fonts/arial.ttf";
    imagettftext($im, 20, 0, 6, 26, $white, $font, $_text);  // Text auf Bildfläche schreiben
    imagecopymerge($dest, $im, 670, 00, 0, 0, 580, 36, 40);     // Webcambild mit Textbild verschmelzen
};

// Daten als JPG Bild an den Browser übergeben
$ts = gmdate("D, d M Y H:i:s") . " GMT";
header("Expires: $ts");
header("Last-Modified: $ts");
header("Pragma: no-cache");
header("Cache-Control: no-cache, must-revalidate");
header("Content-type: image/jpeg"); // nun sagen wir dem Browser, dass er eine JPG-Datei erhält
// Das Bild ausgeben
imagejpeg($dest);

?>

Hallo, ein sehr interessantes Script…
Eine Frage hierzu:
Wo haben Sie das Script eingefügt? Ich betreibe eine WP-Seite und bin mir jetzt nicht sicher, wo ich das Script einfügen kann!?!
Besten Dank im Voraus für Ihre Rückantwort!
LG Karl

Du fügst in deiner WP Seite einfach das Script als Bild ein. Das Script liefert dann durch den entsprechenden Header dem Browser das Bild zurück.

Schau mal bei mir auf https://ferienhaus-schwarzwald-todtnauberg.de/webcam-scheuermattwiese-todtnauberg.html

Ansonsten in HTML in etwa:

<img src="/webcam/scheuermattwiese.php" alt="Scheuermattwiese" title="Blick auf die Scheuermattwiese/Skipiste in Todtnauberg (Livebild, alle 5 Minuten)">

Liebe Grüße

1 „Gefällt mir“

Okay, dann werde ich das mal so testen.
Danke Dir für die schnelle Rückantwort!
LG Karl

Ich habe in Contao auf der Seite ein Element mit dem Inhaltstyp HTML angelegt. Und dort nachfolgendes eingefügt:

<figure class="image_container">
<a href="http://scheuermatthof.de/webcam/scheuermattwiese.php" data-fancybox data-caption="Blick auf die Scheuermattwiese/Skipiste in Todtnauberg (Livebild, alle 5 Minuten)">
<img src="/webcam/scheuermattwiese.php" alt="Scheuermattwiese" title="Blick auf die Scheuermattwiese/Skipiste in Todtnauberg (Livebild, alle 5 Minuten)">
</a>
<figcaption class="caption">Livebild Scheuermattwiese (alle 5 Minuten)</figcaption>
</figure>



Das ging ja superschnell. Vielen Dank. Noch eine Frage: wie gehe ich mit dem Script selber um? Wo muss das hin, damit alles klappt?

1 „Gefällt mir“

Ich habe die php Datei mit dem Script auf dem Webspace bei allinkl und das Element in Contao angelegt. Das einzige was „funktioniert“, ist die Anzeige des Elements im Frontend von Contao. Wo muß das Script denn genau liegen? Vielleicht kannst Du mir da weiterhelfen. Danke im voraus.

Hallo, mir würde es sehr weiterhelfen wenn Du mir mitteilen könntest, wo genau die einzelnen Dateien bei Dir liegen (in welchen Verzeichnissen). Auch wo das Script liegt. Mit welcher Contao Version arbeitest Du? Vielleicht liegt da ja auch ein Problem… Ich bekomme das tolle Script nicht ans laufen. Danke vielmals!
Viele Grüße

Ausgehend von deinem Root Verzeichnis (z.B. vom Contao Root Verzeichnis) für deine Domain müsste das Script in dem Ordner liegen, den du im Script bzw. beim Einbauen auf deiner Internetseite angibst. z.B.:

/webcam/spriptname.php

Die im Script angegebenen Verzeichnisnamen müssen auch passen. Der Inhalte, der von der Systemvariablen $_SERVER[‚DOCUMENT_ROOT‘] zurück gegeben wird, kann sich je nach Provider unterscheiden. Hier hat Strato Ende 2020 z.B „heimlich“ eine Veränderung vorgenommen, so dass ich das Scipt bei mir anpassen musste. Du musst also prüfen, welche Werte, d.h. welche Verzeichnispfade du bei deinem Provider geliefert bekommst.

Sorry, dass ich da nicht wirklich helfen kann.

Hier das aktuelle Script wie ich es im Moment verwende:

<?php
// aktuellstes Webcambild einer INSTAR Kamera aus einem Ordner ermitteln, mit einem Logo 
// versehen und dem Browser als JPG übergeben
//
// hier die eigenen Parameter einstellen
$_folder_name = "domainname_de/webcambilder/scheuermattwiese"; // Ordnername fuer die Webcambilder mit Datum Unterordner, ausgehend vom Root Verzeichnis
// $_fixed_filename = "scheuermattwiese.jpg"; // falls Verwendung eines fixen Dateinamens fuer aktuelles Webcambild
$_fixed_filename = false;  // false wenn die neuste Datei gesucht werden soll, ansonst den festen Dateinamen angeben
$_logo_path = "domainname_de/contao/webcam"; // Pfad zum Logo
$_logo_name = "domainname-300.jpg"; // Dateiname des Logos im JPG Format
// $_logo_name = false; // false setzten, wenn kein Logo auf Bild soll, ansonsten Dateinamen angeben
$_text = "Buchung & Infos unter www.domainname.de"; // Text der oben mittig aufs Bild soll
// $_text = false; // false setzten, wenn kein Text aufs Bild soll

// Website root absolut ermitteln, war für Provider Strato erforderlich
$website_root = substr($_SERVER['DOCUMENT_ROOT'], 0, strpos($_SERVER['DOCUMENT_ROOT'], "domainname_de"));

//
// hier geht es mit dem Verarbeiten los - keine Änderungen danach durchführen
//

// festen Dateinamen benutzten oder die neuste Datei ermitteln
if ($_fixed_filename) { // fester Dateiname für aktuellstes Bild des Tages auswählen
    $bild = $website_root . $_folder_name . "/" . date("Ymd") . "/images/" . $_fixed_filename ;
} else {     // neuste Datei im Ordner finden
    $dir  = $website_root . $_folder_name . "/" . date("Ymd") . "/images/";
    $images = glob($dir . "*.jpg");
    rsort($images);
    // ACHTUNG: es wird nach den Dateinamen absteigend sortiert. D.h bei Instar fangen alle geplanten
    // Aufnahmen mit dem Buchstaben P an. Wenn sich eine sonstige Datei mit einem Buchstaben nach dem P 
    // in dem Ordner befindet wird diese Datei ausgegeben!
    $bild = $images[0];
}

if ($bild) {   # Webcambild gefunden?
    $dest = imagecreatefromjpeg($bild);
}
else {         # kein Webcambild, daher eigenes Fehlerbild generieren
    $errorbild = imagecreatetruecolor(1920, 1080);    // Bildfläche für Text erzeugen
    $white = imagecolorallocate($errorbild, 255, 255, 255);
    $black = imagecolorallocate($errorbild, 0, 0, 0);
    imagefilledrectangle($errorbild, 0, 0, 1920, 1080, $white);  // Bildfläche mit Rechteck füllen
    $font = $website_root . "/fonts/arial.ttf";
    imagettftext($errorbild, 40, 0, 500, 500, $black, $font, "aktuell kein Webcambild gefunden.");  // Text auf Bildfläche schreiben
    $dest = $errorbild;
}    

// Logo mit Bild verschmelzen oder nicht?
if ($_logo_name) {
    $logo = $website_root . $_logo_path . "/" . $_logo_name;
    // Bilder für Mergefunktion vorbereiten
    $logofile = imagecreatefromjpeg($logo);
    imagecopymerge($dest, $logofile, 1610, 907, 0, 0, 300, 163, 75);     // Bild mit Logo verschmelzen
    // hier eventuell Position und Größe des Logos anpassen !!!
};

// Text aufs Bild?
if ($_text) {
    $im = imagecreatetruecolor(600, 40);    // Bildfläche für Text erzeugen
    $white = imagecolorallocate($dest, 255, 255, 255);
    $black = imagecolorallocate($dest, 0, 0, 0);
    imagefilledrectangle($im, 0, 0, 600, 40, $black);  // Bildfläche mit Rechteck füllen
    $font = $website_root . "/fonts/arial.ttf";
    imagettftext($im, 20, 0, 6, 26, $white, $font, $_text);  // Text auf Bildfläche schreiben
    imagecopymerge($dest, $im, 670, 00, 0, 0, 580, 36, 40);     // Webcambild mit Textbild verschmelzen
};

// Daten als JPG Bild an den Browser übergeben
$ts = gmdate("D, d M Y H:i:s") . " GMT";
header("Expires: $ts");
header("Last-Modified: $ts");
header("Pragma: no-cache");
header("Cache-Control: no-cache, must-revalidate");
header("Content-type: image/jpeg"); // nun sagen wir dem Browser, dass er eine JPG-Datei erhält
// Das Bild ausgeben
imagejpeg($dest);

?>

Das war super schnell
Danke für die Antwort!

Hallo!

Das Script wäre genau das was ich brauche für eine WetterCam.
Ich habe es angepasst zu meinem Rootverzeichnis. Mein Hoster ist webgo GmbH in Hamburg. Testscripte laufen problemlos.
Rufe ich Dein angepasstes Script (webcam.php) im Browser auf, so sehe ich nur einen weißen Bildschirm. Hast Du da noch Tpps? Danke und schöne Grüße von der Mosel

Kann daran liegen, dass das Verzeichnis in der Systemvariable bei deinem Hoster anders aufgebaut ist? Du müsstest versuchen, dir die Variablen mit einem ECHO im Script ausgeben zu lassen, um zu endecken, ab wo es nicht mehr passt.

Ok, danke, schau mal weiter nach einer Lösung.