Seite 1 von 1

Zufallsbild wird nicht angezeigt

Verfasst: 27.01.2009 19:06
von Coren
Hallo allerseits!

Ich habe einen Ordner mit Bildern, die ich zufallsgeneriert über das IMG-Tag angezeigt bekommen möchte.

Hierzu verwende ich diese PHP-Datei rid.php:

Code: Alles auswählen

<?php 
#This script has been developped by Nenad Motika [nmotika@bezveze.com]
#Please feel free to use it and to contact me for any reason

//read folder
$folder=opendir("."); 
while ($file = readdir($folder)) 
$names[count($names)] = $file; 
closedir($folder);
//sort file names in array
sort($names);
//remove any non-images from array
$tempvar=0;
for ($i=0;$names[$i];$i++){
$ext=strtolower(substr($names[$i],-4));
if ($ext==".jpg"||$ext==".gif"||$ext=="jpeg"||$ext==".png"){$names1[$tempvar]=$names[$i];$tempvar++;}
}
//random
srand ((double) microtime() * 10000000);
$rand_keys = array_rand ($names1, 2);
//random image from array
$slika=$names1[$rand_keys[0]]; 
//image dimensions
$dimensions = GetImageSize($slika); 
if (isset($HTTP_GET_VARS["pic"])){header ("Location: $slika");}
else {echo "<img src=\"$slika\" $dimensions[3]>";}
?>
Und rufe das ganze über rid.php?pic=random auf.

Nun wird das Zufallsbild zwar angezeigt, wenn ich die URL direkt aufrufe aber leider nicht, wenn ich diese in einem IMG-Tag verpacke.

Kann mir da evtl. jemand weiterhelfen?

Gruß, Coren

Re: Zufallsbild wird nicht angezeigt

Verfasst: 27.01.2009 19:13
von piero
funktioniert es wenn du das:

Code: Alles auswählen

header("Content-Type: {$dimensions['mime']}");
noch dazufügst?
mit dem wird dem browser noch mitgeteilt, dass er ein bild vor sich hat...

Code: Alles auswählen

    <?php
    #This script has been developped by Nenad Motika [nmotika@bezveze.com]
    #Please feel free to use it and to contact me for any reason

    //read folder
    $folder=opendir(".");
    while ($file = readdir($folder))
    $names[count($names)] = $file;
    closedir($folder);
    //sort file names in array
    sort($names);
    //remove any non-images from array
    $tempvar=0;
    for ($i=0;$names[$i];$i++){
    $ext=strtolower(substr($names[$i],-4));
    if ($ext==".jpg"||$ext==".gif"||$ext=="jpeg"||$ext==".png"){$names1[$tempvar]=$names[$i];$tempvar++;}
    }
    //random
    srand ((double) microtime() * 10000000);
    $rand_keys = array_rand ($names1, 2);
    //random image from array
    $slika=$names1[$rand_keys[0]];
    //image dimensions
    $dimensions = GetImageSize($slika);
    // send mime-type
    header("Content-Type: {$dimensions['mime']}"); // <----
    if (isset($HTTP_GET_VARS["pic"])){header ("Location: $slika");}
    else {echo "<img src=\"$slika\" $dimensions[3]>";}
    ?>

Re: Zufallsbild wird nicht angezeigt

Verfasst: 27.01.2009 23:01
von Coren
Hallo piero!

Danke für deine schnelle Antwort.

Wenn ich die von dir genannte Änderung vornehme kann ich das Bild leider weder im IMG-Tag, noch als direkte URL sehen; man sieht nur ein Fehlerbild.

Gruß, Coren

Re: Zufallsbild wird nicht angezeigt

Verfasst: 27.01.2009 23:47
von piero
Beim Umprogrammieren des Scripts ist mir dann aufgefallen, dass dieses Script eigentlich gar kein Bild ausgibt... sondern html code :lol:

Code: Alles auswählen

<img src="zufallsbild.png" width="yx" height="xy">
Die Browser zeigen das aus Kompatibilitätsgründen alle ohne Fehler an...

Wo hast du das überhaupt ausgegraben? Das ist noch für php4 programmiert worden^^


Hier jetzt das funktionierende Script ;)

Code: Alles auswählen

<?php
    // Read images from this folder
    $folder = '.';
    // Allowed types for images
    $type = array(
        'jpg',
        'jpeg',
        'gif',
        'png',
    );

    // --------------

    //read folder
    $folder = opendir($folder);
    while ($file = readdir($folder))
    {
        $names[] = $file;
    }
    closedir($folder);

    //remove any non-images from array
    for ($i = 0; count($names) > $i; $i++)
    {
        $ext = explode('.', $names[$i]);
        $ext = strtolower($ext[count($ext) - 1]);
        
        if (in_array($ext, $type)) 
        {
            $images[] = $names[$i];
        }
    }

    //random image from array
    $image = $images[array_rand($images, 1)];

    // imagesize + mime type
    $size = getimagesize($image);
    // open the image to read and send it
    $fp = fopen($image, "rb");
    if ($size && $fp) {
        header("Content-type: {$size['mime']}");
        fpassthru($fp);
        exit;
    } else {
        // Fehler, hier kannst du dann zB. ein "Fehlerbild" schicken.
    }
?>

Re: Zufallsbild wird nicht angezeigt

Verfasst: 28.01.2009 00:10
von Coren
Hi piero!

Dein neuer Code funktioniert ja sowas von super!
Freu mich total, dass das nun funktioniert! =)

Den obrigen Code habe ich durch Google-Suche auf der genannten Website gefunden.

Vielen Dank für deine Hilfe =)

Gruß, Coren

edit: Eine Frage noch: Bei dem "Fehlerbild"; muss da dann eine ganze URL eingefügt werden oder nur der Bildname?

Re: Zufallsbild wird nicht angezeigt

Verfasst: 29.01.2009 00:44
von piero
Da ich eh schon am Code optimieren bin: Dein Error-Bildchen kannst du jetzt in der Variable $error_img angeben. Das Bild wird im Ordner $folder gesucht, kannst du aber auch ändern...
In der Variable $exclude kannst duauch Bilder eingeben, die du durch das Script nicht anzeigen möchtest...

Code: Alles auswählen

<?php
    // Read images from this folder
    $folder = '.';
    // Allowed types for images
    $type = array(
        'jpg',
        'jpeg',
        'gif',
        'png',
    );
    // Show this image on errors 
    $error_img = 'error.png';
    // Exclude this images
    $exclude = array(
        $error_img,
    );
    
    // --------------

    // read folder and remove any non-images from array
    $folder = opendir($folder);
    while ($file = readdir($folder))
    {
        $ext = explode('.', $file);
        $ext = strtolower($ext[count($ext) - 1]);
        
        if (in_array($ext, $type) AND !in_array($file, $exclude) AND !is_dir($file)) 
        {
            $images[] = $file;
        }
    }
    closedir($folder);
    
    // choose random image from array
    $image = $images[array_rand($images, 1)];

    
    // open the image to read and send it
    if ($fp = fopen($image, 'rb')) 
    {
        $mime = getimagesize($image);
        header('Content-type: ' . $mime['mime']);
        fpassthru($fp);
        fclose($fp);
    } 
    elseif($fp = fopen($error_img, 'rb')) 
    {
        // Send this image on errors
        $mime = getimagesize($error_img);
        header('Content-type: ' . $mime['mime']);
        fpassthru($fp);
        fclose($fp);
    } 
    else 
    {
        // If can't open $error_img ...
        echo 'Irgendeine Fehlermeldung...';
    }
?>