PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Diashow / Galerie GD-lib



daemonb
25-12-2002, 22:50
Also folgendes Problem:

Ich habe heute den ganzen Tag schon drangesessen, aber ich denke meine PHP kenntnisse sind einfach nicht tief genug.
Ich habe vor sowas wie eine diashow zu machen. Für das resizen der grafiken habe ich schon ein skript gefunden:

<?php
header("Content-type: image/jpeg");

$file= "test.jpg";
$file2= "test_resized.jpg";
// $path= "image";
if(file_exists("$file")) {
//Originalbild einlesen
$h_img= imagecreatefromjpeg("$file");
$width= imagesx($h_img);
$height= imagesy($h_img);

// Thumbnail im Speicher erzeugen
$thb_x= 400;
$thb_y= 200;
$h_thb= imagecreate($thb_x, $thb_y);

// Verkleinern
imagecopyresized(
$h_thb,
$h_img,
0,
0,
0,
0,
$thb_x,
$thb_y,
$width,
$height
);

// In File speichern
imagejpeg($h_thb, "$file2");

// Aufräumen
//imagedestroy($h_thb);
//imagedestroy($h_img);
}

// Ausgabe
readfile("$file2");
?>

Das funktioniert auch soweit. Nun jetzt das eigentlich problem:

Es soll eine art diashow werden, bei der man immer auf weiter klickt, um zum nächsten bild zu gelangen, am ende soll er wieder an den anfang springen.
Die Bilder liegen in einem Verzeichnis vor. Es sind zum beispiel 24 bilder, diese bilder soll er einmal verkleinern, dann erst wieder wenn sich an den zugrundeliegenden bildern etwas geänder hat. Achja als wäre das noch nicht genug, wenn man die bilder anklickt soll das ursprüngliche bild, also das große angezeigt werden.
Mit hilfe von php.net bin ich noch dazu gekommen, damit habe ich auch experimentiert:

<?
function CheckExt($filename, $ext) {
$passed = FALSE;
$testExt = "\.".$ext."$";
if (eregi($testExt, $filename)) {
$passed = TRUE;
}
return $passed;
}

//Define an array of common extensions.
$exts = array("gif","jpg$|\\.jpeg","png","bmp");
$directory = ".";
echo "<b>Images in this folder:</b>";
$dir = opendir("$directory");
$files = readdir($dir);

while (false !== ($files = readdir($dir))) {
foreach ($exts as $value) {
if (CheckExt($files, $value)) {
//echo "<a href=\"$directory/$files\">$files</a>\n";
$count++; //Keep track of the total number of files.
echo $files,"\n";
echo "<img src=\"$files\">";
break; //No need to keep looping if we've got a match.
}
}

}
echo $count." image(s) found in this directory.\n";
echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Refresh</a>\n";
//Be a good script and clean up after yourself...
closedir($dir);

?>

Ich hatte das schon soweit, dass es alle resized hat, dass allerding jedesmal, also ich komm echt net weiter wenn einer ne lösung hat, wäre ich dankbar.

bis denne

DaemonB

Gaert
26-12-2002, 19:57
Hallo!

Die Thumbs nur neu zu erzeugen wenn sich was geändert hat stell ich mir schwer vor... da müsstest du ja z.B. das Datum der Dateien loggen und dann jedesmal vergleichen, ob sich das verändert hat!

Anderer Vorschlag:
Wieso schreibst du nicht einfach ein Skript, dass dir die Bilder "on the fly" verkleichnert.

Nennen wir es image.php ....

image.php?id=10

gibt dir z.B. Bild nummer 10 aus (ob das Bild nun 10.jpg heisst oder das 10te in einem Verzeichnis ist oder in einer Datenbank unterm index 10 liegt is ja wurscht)

image.php?id=10&thumb=1

gibt dir deb verkleinerten Thumbnail des Bilds zurück!


In dem image.php Skript setzt du einfach am Anfang den richtigen header also z.B.

header("Content-type: image/jpeg");

Für den "Normalmodus" holst du dir das Bild (aus ner datei oder aus ner DB) und gibst es mit echo aus.

Im "Thumbnailmodus" holst du dir das Bild und verkleinerst es wie in deinem Beispiel angegeben.... danach gibst du das ganze auch wieder aus.

Hab keine Ahnung in wiefern das Ganze durch die Serverlast langsam wird... auspobieren!

Gaert
30-12-2002, 01:01
Servus!

Hab mir nochmal Gedanken gemacht!

Die einfachste möglichkeit zu checken ob du einen Thumbnail neu erstellen musst oder nicht ist folgende:

<?php
if (filemtime($bild) > filemtime($bild_thumb))
{
[.. neuen Thumb erstellen..]
}
[.. Thumb ist neuer als die Originaldatei ..]
?>

Das brauchste jetzt bloß noch irgendwo einbauen...

Gaert
30-12-2002, 01:32
Hier ist das Skript dazu... hab mir gedacht ich könnte sowas in der Art auch mal gebrauchen!

Ist aber noch lange nicht perfekt also net meckern...



<?php
$gallery = "./images/gallery1/";

function scan_gallery($gallery)
{
$files=array();
@$dir = opendir($gallery);
if (!$dir) return $files;
while($item = readdir($dir))
{
if($item=="." or $item=="..") continue;
$file=$gallery . $item;
if(is_file($file))
{
$files[]= $file;
}
}
return $files;
}

function check_thumbs($files)
{
$thumbs=array();
foreach($files as $file)
{
$thumb = dirname($file) . "/thumb/" . basename($file);
if (filemtime($file) > @filemtime($thumb))
{
create_thumb($file,$thumb);
}
$thumbs[]=$thumb;
}
return $thumbs;
}

function create_thumb($file,$thumb)
{
if(!file_exists($file))
return false;

//Originalbild einlesen
$h_img= imagecreatefromjpeg($file);
$width= imagesx($h_img);
$height= imagesy($h_img);

// Thumbnail im Speicher erzeugen
$thb_x= $width/10;
$thb_y= $height/10;
$h_thb= imagecreate($thb_x, $thb_y);

// Verkleinern
imagecopyresized(
$h_thb,
$h_img,
0,
0,
0,
0,
$thb_x,
$thb_y,
$width,
$height
);

// In File speichern
imagejpeg($h_thb, "$thumb", 50);
}


$files = scan_gallery($gallery);
$thumbs = check_thumbs($files);
foreach($thumbs as $i=>$file)
{
$i++;
echo "Bild Nr $i:<img src=\"$file\" alt=\"\" /><br />";
}
?>



$gallery enthält übrigens den Pfad zu dem Verzeichnis in dem die Bilder liegen und muss gesetzt werden...

$files ist ein Array und bekommt die Pfade zu allen Bildern zugewiesen...
$thumbs ist ein Array und bekommt die Pfade zu allen Thumbnails zugewiesen ...
Daraus kann man sich dann ganz einfach die Gallerie zusammenbauen ;)

Die Thumbnails werden nur erstellt, wenn die Originaldateien neuer sind, oder für das Bild noch kein Thumbnail vorhanden ist (und zwar im Unterverzeichnis thumb)!

daemonb
30-12-2002, 14:38
danke gaert, habe im mom allerdings keine zeit ich sage bescheid wenn ich es angetestet habe muchas gracias senor.

bis denne

DaemonB