Zufällige Bilder aus einem Ordner (für Foren etc.) v1.1.0

Wir sammeln alle Infos der Bonusepisode von Pokémon Karmesin und Purpur für euch!

Zu der Infoseite von „Die Mo-Mo-Manie“
  • Benötigt:

    • GDLib in der Version 2.0 oder höher
    • Die Bilder müssen in einem der Formate PNG, GIF oder JPEG vorliegen
    • Die Dateiendungen müssen folgendermaßen aussehen:

      • GIF - .gif
      • PNG - .png
      • JPEG - .jpg


    Anmerkung: Version 1.0.0 wird nichtmehr angeboten.


    PHP
    <?php	//Mit diesesm Script könnt ihr euch mehrere Bilder aus einem Ordner zufällig ausgeben lassen	//Es basiert auf dem Script von Chris!, wurde von mir aber etwas angepasst, um es auch in Foren etc.	//als Signatur verwenden zu können. Überall, wo ein BBCode für Bilder erlaubt ist, könnt ihr auch diese Script verwenden.	//Damit ihr eigene Bilder verwenden könnt, müsst ihr aber noch ein paar Dinge anpassen. Die Stellen hab ich	//entsprechend kommentiert	//Autor: http://www.bisaboard.de/index.php?page=User&userID=13391	//Support: http://www.bisaboard.de/index.php?page=Thread&threadID=95698	//Lizenz: http://www.gnu.org/licenses/gpl.html	//Basis des Script: http://www.bisaboard.de/index.php?page=Thread&threadID=86156	//Version: 1.1.0	$Bilder = array();	$Ordner = "./bilder";							//hier müsst ihr den Ordner referenzieren, in dem die Bilder liegen., ausgehend vom Ordner, in dem das Script liegt	$dateiendungen = array("png", "jpg", "gif");	//hier werden alle möglichen Dateiendungen angegeben	$ordner = opendir($Ordner);	while ($Datei = readdir($ordner)) {		if (!is_dir($Datei)) {			if ($Datei != "..") {				if (strstr($Datei, ".")) {					$punkt = strrpos($Datei, ".");					$endung = strtolower(substr($Datei, $punkt + 1));					if (in_array($endung, $dateiendungen)) {						$Bilder[] = $Ordner . "/" . $Datei;					}				} 			}		}	}	closedir($ordner);	srand((double)microtime() * 10000000);	$index = array_rand($Bilder, 1);	$image = $Bilder[$index];	if (strpos($image, ".jpg")) {					 	header("Content-type: image/jpeg");		$image = imageCreateFromJPEG($image);		imageJPEG($image,'',100);					//falls ihr die Qualität des ausgegebenen JPG's ändern wollt, müsst ihr hier für 100 eine andere Zahl zwischen 0 und 100 (0 schlecht; 100 gut) angeben		imageDestroy($image);	} elseif (strpos($image, ".png")) {		header("Content-type: image/png");		$image = imageCreateFromPNG($image);		imagePNG($image);		imageDestroy($image);	} elseif (strpos($image, ".gif")) {		header("Content-Type: image/gif");		$image = imageCreateFromGIF($image);		imageGIF($image);		imageDestroy($image);	}?>


    So, für die Erste Hälfte könnt ihr auch gerne in das andere Topic von Chris! schauen, dann kann ich mir das Erklären sparen^^
    Nur den Part der für das zufällige auswählen des Bildes wurde von mir angepasst. Deswegen werden auch das array $nummern und die Variable $anzahl nicht mehr benötigt. Hier auch meinen dank an DaS SchaF bezüglich dieser Anpassung. Also, hier die Veränderte Zufallsauswahl:

    PHP
    <?php	srand((double)microtime() * 10000000);	$index = array_rand($Bilder, 1);	$image = $Bilder[$index];?>


    Also, mit der Funktion srand wird er Zufallsgenerator initalisiert. Um einen möglichst zufälligen Startwert zu bekommen, wird per microtime() die aktuelle Zeit als Timestamp in Micro-Sekunden ermittelt. Dieser Wert wird dann noch multipliziert, um eben eine sehr hohe Zahl zu erhalten. (double) deklariert den zurückgegebenen Wert übrigens als Fließkommazahl.


    Per array_rand($Bilder, 1) wird jetzt ein zufälliger Index aus dem Array zurückgegeben. Wie array's funktionieren setzt ich hier einfach mal vorraus. Ansonsten schaut einfach mal in das PHP-Tutorial. Als Parameter erwartet die Funktion ein Array, hier also das array, in dem die Pfade zu den Bildern gespeichert sind und wie viele Indiezes zurückgegeben werden wollen. Hier ist natürlich nur ein Index sinvoll. Der zurückgegebene Wert wird dann in der Varibalen $index gespeichert.


    Nun wird in $image ein Wert aus dem Array $Bilder gespeichert. Als Index wird der vorher zufällig bestimmte Index verwendet, der in der Variablen $index gespeichert ist.



    Ich hab auchl nur beispielhaft eine der drei if-Abfrage-Blöcke rausgenommen, um euch zu erklären, was die einzelnen Funktionen bewirken. Ein paar Hinweise seht ihr ja auch als Kommentar im Script. Also:


    Also, mit der funktion strpos($image, ".gif") wird überprüft, ob der String .gif bestandteil des in $image gespeicherten Strings ist. Falls nein, wird FALSE zurückgegeben, was automatisch bewirkt, dass zum nächsten Anfrage-Block gesprungen wird. Falls ja, wird hingegen die Position des ersten Zeichens der gefundenen Zeichenkette zurückgegeben. Da jeder Werte, der größer oder gleich 1 als TRUE interpretiert wird, wird in diesem Fall der Abfrage-Block ausgeführt.


    Wird der Abfrage-Block ausgeführt, wird erstmal mit der header-Funktion der korrekte MIME-Type an den Browser übermittelt.


    Mit der Funktion imageCreateFromGIF($image) wird aus dem in $image gespeicherten Pfad ein Bild erzeugt und in den Arbeitsspeicher geladen. Selbes übernehmen die Funktionen imageCreateFromPNG bzw. JPEG nur eben für die anderen Formate in den anderen Abfrageblöcken. Das Bild im RAM wird dann wieder in der Variablen $image gespeichert.


    Die Funktion imageGIF($image) gibt dann das Bild aus. Wieder übernehmen die Funktionen imagePNG bzw. JPEG das selbe für die anderen Formate. Nur den Hinweis bei der JPEG-Funktion solltet ihr beachten.


    Als letztes wird dann das Bild mit der Funktion imageDestroy($image) aus dem Arbeitsspeicher gelöscht.



    So, dies ist die aller erste Version des Script. In einer kommenden Version möchte ich das Script auf jedenfall moderner gestalten. Vielleicht biete ich in naher Zukunft auch noch einen Webservice an, wo ihr nur die gewünschten Bilder hochladen müsst und dann einen passenden Link erhaltet.

  • find ich gut ;)
    nur eine Frage hab ich:

    PHP
    $anzahl = 10;                                    //hier ist es wichtig, dass ihr exakt die Anzahl der vorhandenen Bilder angebt.


    in meinem Ursprünglichen Skript war dies die Anzahl der Bilder, die ausgegeben werden.
    Müsste dann hier nicht eigentlich immer 1 stehen? Da ja nur 1 Bild mit der GDlib ausgegeben wird....

  • Also als ich dein Script das erste mal ausprobiert hab, wurden viel mehr Bilder ausgegeben, als nur eines. Dann hab ich $anzahl die Anzahl der Bilder im Ordner zugewiesen und dann hat es wieder funktioniert. Es wurde nur ein Bild ausgegeben.
    Ob es so richtig ist, wie du gesagt hast, oder mein Weg, werd ich mir später nochmal anschauen. Weil grad in nem Kurzversuch ging sowohl die Komplette Anzahl der vorhandenen Bilder, als auch wenn $anzahl = 1 zugewiesen wird.


    Edit: Also ich habs jetzt grad nochmal ausprobiert. Scheinbar ist es in meinem Script egal, welche Zahl man für $anzahl angibt. Es muss nur eine Zahl größer Null sein. Ich werd mal versuchen rauszufinden, was jetzt genau los is. Wird dann in v1.0.1 behoben^^

  • Also als ich dein Script das erste mal ausprobiert hab, wurden viel mehr Bilder ausgegeben, als nur eines. Dann hab ich $anzahl die Anzahl der Bilder im Ordner zugewiesen und dann hat es wieder funktioniert. Es wurde nur ein Bild ausgegeben.
    Ob es so richtig ist, wie du gesagt hast, oder mein Weg, werd ich mir später nochmal anschauen. Weil grad in nem Kurzversuch ging sowohl die Komplette Anzahl der vorhandenen Bilder, als auch wenn $anzahl = 1 zugewiesen wird.


    Edit: Also ich habs jetzt grad nochmal ausprobiert. Scheinbar ist es in meinem Script egal, welche Zahl man für $anzahl angibt. Es muss nur eine Zahl größer Null sein. Ich werd mal versuchen rauszufinden, was jetzt genau los is. Wird dann in v1.0.1 behoben^^


    Ja, eigentlich ist es egal, da $image dann einfach $anzahl mal neu beschrieben wird.
    Am besten wär immernoch 1, da es ursprünglich auch so war ;)

  • bleibt noch eine kleine Unschönheit:

    Zitat

    Ihr dürft das Script nach euren Wünschen, aber diesen und den folgenden Kommentar nicht entfernen:


    fehlt da nicht was?

  • So, ich hab eure Anmerkungen jetzt mal umgesetzt und direkt in einer neuen Version 1.0.1 veröffentlicht. Ist jetzt auch die Aktuelle Version, die man im Startpost findet.
    Und danke an DaS SchaF. Die Funktion hats echt um einiges leichter gemacht^^ Man lernt eben nie aus.

  • Ich hab mir schon mal überlegt gehabt, ob ich mein Script, dass ich vor Monaten schon gecodet hatte auch hier veröffentlichen soll. Aber da bin ich jetzt wohl zu spät dran. Das ist im Prinzip genau das gleiche, hat aber immer noch ein paar Vorteile: Man benötigt keine GDlib, es gibt keine Qualitätsverluste bei JPEG-Bildern und es wird vermutlich schneller vom Server ausgeführt.


    Aber ich stehe eh nicht so auf Zufallsbilder... ein Bannerwechsler (mit Cookies) ist viel cooler (siehe Sig). ^^



    Du solltest in deinem Topic noch die Sache mit dem mod_rewrite reinnehmen.
    Du schreibst zwar in den Kommentaren:

    Zitat

    Überall, wo ein BBCode für Bilder erlaubt ist, könnt ihr auch diese Script verwenden.


    , das stimmt aber nicht. Denn einige Foren erlauben nicht alle Dateiendungen, deswegen wird es in diesen Foren nicht funktionieren. Das WBB3 ist da ne Ausnahme (wie prüft das eigentlich? Über den MIME-Typ?).