Thumbnails on the fly mit php

Kufstein

B1G-Software-Kunde
#1
Hi Leute,


ich suche ein Script wo ich ein Bild als Tumbnails ausgegeben wird. z.B. thumbnal.php?img=/html/www/webxx/files/img/love.jpg und mir wird das Bild "On the Fly" als Thumbnails rausgegeben.

Hat jemand ne ahnung wie ich des anstelle ?

Falls ihr euch fragt, für was ich des schon wieder brauche:

Ich will eine Bildergalierie meinen USern anbieten, die großen Bilder sollen sie nur ansehen können wenn sie eingeloogt sind, dass mach ich mit readfile in einer PHP datein. aber die Thumbnails sollen auch sichtbar sein, wenn man ncicht eingellogt ist ...
 
Last edited:

Kufstein

B1G-Software-Kunde
#3
Ja, aber dieser Script speichert die Thumbnail datei ab, ich brauche aber einen wo ich <img src="thumb.php?img=datei.php"> machen kann, ohne dass die Datei irgendwo abgespeichert wird , ich habe auch schon geggolet, auch was gefunden, aber es funktioniert nicht....

siehe ---> http://q-radio.eu/thumbnail.php?src=love.jpg&w=100


PHP:
<?php
    # Nachfolgende Funktion ist für die Ausgabe eventueller Fehler als Bild zuständig
    function error_message($text = ''){
        $img = imagecreatetruecolor(strlen($text) * 7, 20); // Erstellt ein neues Bild
        imagefill($img, 0, 0, imagecolorallocate($img, 255, 255, 255)); // Malt das bild weiß aus
        imagestring($img, 2, 0, 0, $text, imagecolorallocate($img, 0, 0, 0)); // Schreibt den Text der der Funktion übergeben wurde auf das Bild
        imagepng($img); // Gibt das Bild aus
        imagedestroy($img); // Löscht das Bild aus dem Arbeitsspeicher des Servers
    }
    $img_src = $_GET['src']; // Pfad zum Bild aus welchem das Thumbnail erstellt werden soll
    $cache_dir = './cache'; // Pfad zum Cache Verzeichnis wo später die Bilder gespeichert werden
    $cache = true; // Gibt an ob die Bilder aus dem Cache geladen werden sollen
    # Überprüft ob ein Bildpfad übergeben wurde
    if (!isset($_GET['src'])){
        error_message('Es wurde kein Bildpfad übergeben aus dem ein Thumbnail ezeugt werden könnte'); // Gibt eine Fehlermeldung aus
    }
    # Auslesen der Bildgröße und des Bildtyps
    $image_infos = @getimagesize($img_src) or error_message('Auf das Bild kann nicht zugegriffen werden');
    $width = $image_infos[0];
    $height = $image_infos[1];
    $type = $image_infos[2];
    $mime = $image_infos['mime'];
    # Berechnung der Maße des Thumbnails
    if (isset($_GET['w']) && !isset($_GET['h'])){ // Überprüfen ob die Breite oder die Höhe berechnent werden soll
        $new_width = intval($_GET['w']); // Zuweisen der neuen Breite
        $new_height = ceil($height * $new_width / $width); // Berechnen der neuen Höhe
    } else if (isset($_GET['h']) && !isset($_GET['w'])){ // Überprüfen ob die Breite oder die Höhe berechnent werden soll
        $new_height = intval($_GET['h']); // Zuweisen der neuen Höhe
        $new_width = ceil($width * $new_height / $height); // Berechnen der neuen Breite
    } else if (isset($_GET['h']) && isset($_GET['w'])){
        $new_height = intval($_GET['h']); // Zuweisen der neuen Höhe
        $new_width = intval($_GET['w']); // Zuweisen der neuen Breite
    } else {
        error_message('Es muss entweder die neu Höhe oder die neu Breite angegeben werden.'); // Fehlermeldung ausgeben
    }
    # Prüft ob das Chache Verzeichnis existiert bzw. benötigt wird und legt dieses eventuell an
    if ($cache === true && !file_exists($cache_dir)){
        mkdir($cache_dir) or error_message('Das Cache Verzeichnis konnte nicht angelegt werden'); // Legt das Cache Verzeichnis an. Sollte dies nicht möglich sein, so wird ein Fehler ausgegeben
        chmod($cache_dir, 0777); // Gibt dem Cache Verzeichniss die nötigen Schreib- und Lese Rechte
    }
    # Ermitteln des Bildtypes und Erstellung des Thumbnails
    switch ($type){
        case 1:
            header('Content-type: '.$mime); // Header ausgeben
            if (imagetypes() & IMG_GIF){ // Überprüfen ob das Bildformat untestützt wird
                if (!file_exists($cache_dir.'/'.md5($img_src).'.gif')){ // Wenn das Thumbnail nicht existiert wird es erstellt
                    $orginal = imagecreatefromgif($img_src) or error_message('Das Bild wurde nicht gefunden'); // Bild aus dem Orginalbild erstellen
                    $thumb = imagecreatetruecolor($new_width, $new_height); // Das Thumbnailbild erstellen
                    imagecopyresampled($thumb, $orginal, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
                    if ($cache === true){ // Prüft ob das Bild gespeichert werden soll
                        imagegif($thumb, $cache_dir.'/'.md5($img_src).'.gif') or error_message('Das Bild konnte nicht gespeichert werden'); // Bild speichern
                    }
                    imagegif($thumb); // Bild ausgeben
                } else {
                    readfile($cache_dir.'/'.md5($img_src).'.gif') or error_message('Das Bild wurde nicht gefunden'); // Bild ausgeben
                }
            } else {
                error_message('GIF Bilder werden nicht unterstützt'); // Fehlermeldung ausgeben, wenn das Bildformat nicht unterstützt wird
            }
            break;
        case 2:
            header('Content-type: '.$mime); // Header ausgeben
            if (imagetypes() & IMG_JPG){ // Überprüfen ob das Bildformat untestützt wird
                if (!file_exists($cache_dir.'/'.md5($img_src).'.jpg')){ // Wenn das Thumbnail nicht existiert wird es erstellt
                    $orginal = imagecreatefromjpeg($img_src) or error_message('Das Bild wurde nicht gefunden'); // Bild aus dem Orginabild erstellen
                    $thumb = imagecreatetruecolor($new_width, $new_height); // Das Thumbnailbild erstellen
                    imagecopyresampled($thumb, $orginal, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
                    if ($cache === true){ // Prüft ob das Bild gespeichert werden soll
                        imagejpeg($thumb, $cache_dir.'/'.md5($img_src).'.jpg') or error_message('Das Bild konnte nicht gespeichert werden'); // Bild speichern
                    }
                    imagejpeg($thumb); // Bild ausgeben
                } else {
                    readfile($cache_dir.'/'.md5($img_src).'.jpg') or error_message('Das Bild wurde nicht gefunden'); // Bild ausgeben
                }
            } else {
                error_message('JPEG Bilder werden nicht unterstützt'); // Fehlermeldung ausgeben, wenn das Bildformat nicht unterstützt wird
            }
            break;
        case 3:
            header('Content-type: '.$mime); // Header ausgeben
            if (imagetypes() & IMG_PNG){ // Überprüfen ob das Bildformat untestützt wird
                if (!file_exists($cache_dir.'/'.md5($img_src).'.png')){ // Wenn das Thumbnail nicht existiert wird es erstellt
                    $orginal = imageCreateFromPNG($img_src) or error_message('Das Bild wurde nicht gefunden'); // Bild aus dem Orginalbild erstellen
                    $thumb = imagecreatetruecolor($new_width, $new_height); // Das Thumbnailbild erstellen
                    imagecopyresampled($thumb, $orginal, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
                    if ($cache === true){ // Prüft ob das Bild gespeichert werden soll
                        imagepng($thumb, $cache_dir.'/'.md5($img_src).'.png') or error_message('Das Bild konnte nicht gespeichert werden'); // Bild speichern
                    }
                    imagepng($thumb); // Bild ausgeben
                } else {
                    readfile($cache_dir.'/'.md5($img_src).'.png') or error_message('Das Bild konnte nicht gespeichert werden'); // Bild ausgeben
                }
            } else {
                error_message('PNG Bilder werden nicht unterstützt'); // Fehlermeldung ausgeben, wenn das Bildformat nicht unterstützt wird
            }
            break;
        default:
            error_message('Das Bildformat wird nicht unterstützt'); // Fehlermeldung ausgeben, wenn das Bildformat nicht unterstützt wird
    }
    # Löscht das Bild aus dem Speicher des Servers falls es existiert
    if (isset($thumb)){
        imagedestroy($thumb);
    }
?>
 

UNC

B1G-Software-Kunde
#4
Du kannst sie ja mit tmpfile() speichern... Dann wird die gleich wieder gelöscht. :rolleyes:
Irgendwo muss die Datei meines Wissens gespeichert werden.
 

modig

B1G-Software-Kunde
#5
Huhu,
Thumbs live zu erzeugen halte ich für ungünstig - um es mal vorsichtig auszudrücken.
Erstelle die lieber schon beim hochladen des Bildes. Dieser User hat wesentlich mehr Geduld als der der auf die Erstellung eines Thumbs warten müsste, nur um es anzusehen...

Karsten
 

UNC

B1G-Software-Kunde
#6
Huhu,
Thumbs live zu erzeugen halte ich für ungünstig - um es mal vorsichtig auszudrücken.
Erstelle die lieber schon beim hochladen des Bildes. Dieser User hat wesentlich mehr Geduld als der der auf die Erstellung eines Thumbs warten müsste, nur um es anzusehen...

Karsten
... und weniger rechenintensiv wäre das ganze auch. (Einmal generieren + 1000 mal von der Platte lesen v.s. 1000 mal generieren) :rolleyes:
 

Kufstein

B1G-Software-Kunde
#7
Huhu,
Thumbs live zu erzeugen halte ich für ungünstig - um es mal vorsichtig auszudrücken.
Erstelle die lieber schon beim hochladen des Bildes. Dieser User hat wesentlich mehr Geduld als der der auf die Erstellung eines Thumbs warten müsste, nur um es anzusehen...

Karsten
Ja es sind nicht viele Thumbs ... der Server macht das schon mit ....

ich will ja nur, dass der User es nicht in voller größe ein Bild speichern kann, wenn er nicht eingellogt ist ...
 

modig

B1G-Software-Kunde
#8
...ich will ja nur, dass der User es nicht in voller größe ein Bild speichern kann, wenn er nicht eingellogt ist ...
Ist schon klar.
Also:
Beim hochladen: Bild speichern und thumb erzeugen.
Beim ankucken: {if eingeloggt} volles Bild ausliefern {else} nur thumb ausliefern

Ist wahrscheinlich zuuuuuu einfach? ?(

Karsten ;)
 

Kufstein

B1G-Software-Kunde
#9
Ist schon klar.
Also:
Beim hochladen: Bild speichern und thumb erzeugen.
Beim ankucken: {if eingeloggt} volles Bild ausliefern {else} nur thumb ausliefern

Ist wahrscheinlich zuuuuuu einfach? ?(

Karsten ;)
Ja, ich habs ganz einfach hinbekommen.

Vielen Dank für eure Hilfe ;)



Kann mir noch jemand eine kleine Denkanregung geben, wie ich es hinbekomme, Datensätze aus einer MySql Datenbank auszulesen, und 5 stück nebeneinander anzeigen zu lassen und dann eine neue Zeile beginnen ?
(Soll für eine Bildergallery sein)

also untereinander ist einfach, mit ner for schleife für jedes

<tr>
<td> $DATENARRAY[$I]->FELD </td>
</tr>



Schon mal vielen Dank.

Mit der Geschwindikeit des Scriptes bin ich auch zufrieden.
Hier ist der Code mal für die die sowas auch benötigen.
PHP:
<?php

    if(!function_exists('file_get_contents'))
    {
        function file_get_contents($filename)
        {
            return implode('', file($filename));
        }
    }
   
    function thumbnail($imgFile, $maxWidth = 200, $maxHeight = 150, $output = '')
    {
        if(!function_exists('imagecreatefromstring'))
            trigger_error('GD Library not found', E_USER_ERROR);
           
        if(!file_exists($imgFile))
            trigger_error('File not found: '.$imgFile, E_USER_ERROR);
       
        $image = imagecreatefromstring(file_get_contents($imgFile))
            or trigger_error($imgFile.' is no valid image', E_USER_ERROR);
           
        $oldSize = $imgSize = array(imagesx($image), imagesy($image));
       
        if($imgSize[0] > $maxWidth)
        {
            $imgSize[1] *= $maxWidth / $imgSize[0];
            $imgSize[0] =  $maxWidth;
        }
       
        if($imgSize[1] > $maxHeight)
        {
            $imgSize[0] *= $maxHeight / $imgSize[1];
            $imgSize[1] =  $maxHeight;
        }
       
        if(function_exists('imagecreatetruecolor'))
        {
            $thumbnail = imagecreatetruecolor($imgSize[0], $imgSize[1]);
            imagecopyresampled($thumbnail, $image, 0, 0, 0, 0, $imgSize[0], $imgSize[1], $oldSize[0], $oldSize[1]);
        }
        else
        {
            $thumbnail = imagecreate($imgSize[0], $imgSize[1]);
            imagecopyresized($thumbnail, $image, 0, 0, 0, 0, $imgSize[0], $imgSize[1], $oldSize[0], $oldSize[1]);
        }
       
        imagedestroy($image);
        if($output == '')
            header('Content-type: image/jpeg');
        imagejpeg($thumbnail, $output, 80);
        imagedestroy($thumbnail);
    }
	$dateipfad = "/HIER/DEN/PFAD/ANGEBEN/";
	$fehlerbild = "/HIER/EIN/FEHLERBILD/MIT/PFAD";

   IF (file_exists($dateipfad . $_REQUEST['img'])) {
    thumbnail($dateipfad .$_REQUEST['img'], 200, 300);
} else {
    header('Content-type: image/jpeg');
readfile("$fehlerbild "); 

}


?>
 
Top