Forum: PC-Programmierung PHP zufälliges Bild aus Ordner anzeigen


von Achim (Gast)


Lesenswert?

Hallo zusammen,

ich benötige Hilfe einen Ansatz zu finden, wie ich folgendes umsetze:

Ich möchte auf der Startseite meiner Smart-Home-Umgebung, die ich 
mittels Apache/PHP/Python/Modbus aufgesetzt habe, als Startbildschirm 
ein Foto zeigen.

Bisher springt die Detailseite nach x Sekunden auf eine 
"start.php"-Seite.

Diese läd statisch ein Bild.
1
<a h#r#e#f="index_ha.php"><img src="start.JPG" alt="Bild"  style="width:1004px;height:748px"s/></a>

Dieses Bild möchte ich zufällig/beliebig aus einem Ordner wählen unter 
/var/www/html/backGroundPic

Die Dateinahmen der Bilder beginnen immer mit YYYY-MM-DD + musterlosem 
Dateiname.jpg

Hat jemand einen Ansatz, wie ich hier vorgehen kann?

von Sebastian R. (sebastian_r569)


Lesenswert?

- Alle Dateinamen mit ".jpg" am Ende in dem Ordner in ein Array schubsen
- Nun ein Bild anzeigen, dessen Dateiname das Array mit zufälligem Index 
ist


(Wäre meine Herangehensweise, vielleicht nicht perfekt, aber hey, ein 
Anfang)

: Bearbeitet durch User
von Christoph K. (backdraft007)


Lesenswert?

Hi,
1
$files = array_diff(scandir($path), array('.', '..'));

Dann mit rand() eine Zufallszahl generieren und entsprechend den 
Dateinamen aus dem Array lesen.

Grüße
Chris

von DPA (Gast)


Lesenswert?

Ungetestet. Sollte jede Sekunde das nächste Bild nehmen. Glob sortiert 
alphabetisch.
1
$f=glob("*.jpg");
2
$f=$f[date_timestamp_get()%count($f)];

von Achim (Gast)


Lesenswert?

Vielen Dank zusammen,das waren genau die Ansätze, die ich brauchte.

Hab es nun umgesetzt bekommen und es tut was es soll.
1
<link h#r#e#f="design.css" rel="stylesheet">
2
<meta http-equiv="refresh" content="25">
3
<?php
4
        $path = opendir('/var/www/html/pic/bilderrahmen/');
5
        $files = array_diff(scandir('/var/www/html/pic/bilderrahmen/'), ['.','..']);
6
        $i = rand(2,count($files));
7
        echo $files[$i];
8
        echo "<a hh#r#e#f='index_ha.php'><img src='./pic/bilderrahmen/$files[$i]' alt='Bild'  style='width:1004px;height:748px'/></a>";
9
?>



Das Neuladen habe ich mittels
<meta http-equiv="refresh" content="25">
gemacht.

Das ist ein sehr harter Übergang. Hat jemand eine Idee, das ganze 
weicher zu machen?

von DPA (Gast)


Lesenswert?

Eventuell wäre array_rand() noch interessant.
Übrigens, es sollte möglich sein, nur das Bild neu zu laden, mit dem 
refresh http header (beim der response vom Bild). Eine andere 
Möglichkeiten wären eine iframe. Oder per JS.

von quotendepp (Gast)


Lesenswert?

Achim schrieb:
> Das ist ein sehr harter Übergang.

kein Wunder, da wird ja auch einfach die ganze Seite neu geladen

Achim schrieb:
> Hat jemand eine Idee, das ganze
> weicher zu machen?

da gibts (meiner Mmeinung) nur eine (halbwegs gscheide) Lösung: 2 img 
Tags, die Bildquelle ist ein php script das ein zufälliges Bild 
ausliefert, ein bisschen javascript und css.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

... Und so schnell wird aus "zufälliges Bild aus Ordner anzeigen"
ein komplettes Ajax-Galerie-Script.

von ThomasW (Gast)


Lesenswert?

Ben B. schrieb:
> ... Und so schnell wird aus "zufälliges Bild aus Ordner anzeigen"
> ein komplettes Ajax-Galerie-Script.

naja, so schlimm muss es nicht werden. Es würde ja genügen, wenn beim 
laden der Seite mittels PHP ein Javascript-Array mit den Dateinamen 
befüllt wird. Dann kann ein JS-Script das Array mischen und nach 
vorgegebener Zeit den Inhalt eines Elementes austauschen - indem es das 
nächste Bild aus dem Array lädt. Mal ganz grob skizziert.

von Chris S. (schris)


Lesenswert?

Mach doch ein PHP das dir direkt das Bild streamt und link dieses dann. 
PHP sollte header für JPEG sowie expire cache ausgeben
1
$name = $files[$i];
2
$fp = fopen($name, 'rb');
3
// send the right headers
4
header("Content-Type: image/jpeg");
5
header("Content-Length: " . filesize($name));
6
7
header( 'Expires: Sat, 26 Jul 1997 05:00:00 GMT' );
8
header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s',time()+60*60*8 ) . ' GMT' );
9
header( 'Cache-Control: no-store, no-cache, must-revalidate' );
10
header( 'Cache-Control: post-check=0, pre-check=0', false );
11
header( 'Pragma: no-cache' );
12
13
14
// dump the picture and stop the script
15
fpassthru($fp);
16
exit;

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.