# Thumbnail erzeugen ohne speichern



## BenschM@ster (3. Februar 2008)

Abend allerseits!
Ich habe vor Thumbnails auf dem Server zu erstellen und auf der Website anzuzeigen und zwar ohne das ganze zu speichern.
Tutorials wie man das ganze mit dem Zwischenspeichern auf dem Server macht finde ich zu hauf, aber ohne die Speicherfunktion ist irgendwie nichts zu finden.

Wie ist das möglich?

Vielen Dank,
Ben


----------



## holzmensch (3. Februar 2008)

Dann gib doch das Bild einfach mit einer PHP Datei im src-Attribut an. Fertisch... Dann wird das Bild immer wieder erstellt, wenn man auf die Seite geht.


----------



## hasta_jesaja (3. Februar 2008)

Wenns aber wirklich viele Bilder sind und viele Zugriffe werden, dann zwingst du damit deinen Server sehr schnell in die Knie. Also lieber cachen...

Ansonsten, wie mein Vorredner schon gesagt hat, das Thumbnail über eine .php Datei im src Attribut laden und in der PHP Datei das Thumbnails (jedesmal neu) generieren:


```
<?php

//Natürlich den Bildtyp richtig angeben
header('Content-Type: image/jpg');

//Und hier dein Bild laden, verkleinern und printen

?>
```

Der PHP Datei übergibst du dann natürlich per GET die ID oder den Namen des zu "verthumbnailenden" Bildes


----------



## forsterm (3. Februar 2008)

Hallo,
eventuel hilft dir ja folgendes Codeschnipsel weiter: Thumbnails mit PHP erstellen lassen

mfg
forsterm


----------



## Gumbo (3. Februar 2008)

Die Grafikfunktionen sind aber recht kostenintensiv. Daher solltest du gut abwägen, ob es sich wirklich lohnt, die Grafiken bei jedem Aufruf neu zu generieren.


----------



## BenschM@ster (3. Februar 2008)

Morgen,
vielen Dank für eure Hilfe.
Mein einziges Problem war das erstellen des Bildinhaltes ohne es zu speichern. Ist aber unfassbar einfach und Kompakt der Code:


```
<?php
	$testdatei = "./testordner/test.jpg";
	$size      = GetImageSize($testdatei);
	$new_image = imagecreatetruecolor(200,200);
	$old_image = ImageCreateFromJpeg($testdatei);

	ImageCopyResized($new_image, $old_image,0 , 0, 0, 0, 200, 200, $size[0], $size[1]);

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

?>
```

fertig...
Ist es wirklich sehr kritisch Bilder in der Größe von ca. 150px Breite auf 100px Breite live zu verkleinern?
Wollte eigtl. nicht alle Dateien doppelt abspeichern, aber wenn das die effizientere Methode ist wäre natürlich das die erste Wahl.

Vielen Dank!
Gruß,
Ben


----------



## Gumbo (3. Februar 2008)

Die Ausgangsgröße ist entscheidend.


----------



## hasta_jesaja (3. Februar 2008)

Die Bilder zu speichern ist auf jedenfall die bessere Methode, vor allem bei vielen Zugriffen. Und wegen den paar bytes für ein Thumbnail mehr würde ich mir keine Sorgen machen, ist besser für den Server (egal wie groß oder klein die Bilder sind) und den User, denn ob der Server das Bild laden, verkleiner und dann an den Client schicken oder einfach nur das vorgerenderte Thumbnail abgeben muss ist auch ein Zeitunterschied und wenn der Server stark belastet ist, geht das in die Sekunden. 
Ausserdem wäre das nicht Shared Hosting...

Naja, du siehst... lieber Thumbnail speichern!


----------



## BenschM@ster (3. Februar 2008)

Alles klar, dann werd ich das auch so machen.
Vielen Dank euch allen!


----------



## BenschM@ster (3. Februar 2008)

Mir stellt sich gerade doch noch mal eine Frage.
Und zwar wie übergebe ich der Datei bild.php die den von mir oben geschriebenen Code enthält die Bilddaten?

Wenn das Bild bereits fest an einem Ort abgespeichert ist wie in meinem Beispiel, dann ist das ja kein Problem, aber wenn das Bild gerade hochgeladen wurde und vorerst als Vorschaubild angezeigt werden soll?


----------



## BenschM@ster (3. Februar 2008)

Nochmal detailliert zu meinem Problem...ich verzweifel langsam daran.

Ich habe das Bild $_FILES['bild']
Da handelt es sich aber nur im eine tmp-Datei.
mit $_SESSION['bild'] = $_FILES['bild'] bekomme ich die Datei auch in die Vorschau Datei (ich möchte möglichst wenig über GET gehen).

Wie kriege ich die Datei jetzt aber mit meiner Bild-PHP ausgelesen und als Bild konvertiert:

```
<?php
	session_start();
	if(!isset($_SESSION['bild']) ) {
		die("Kein Bild vorhanden");
	}
	if( headers_sent() )
		die("Konnte Bild nicht anzeigen");

	$datei = $_SESSION['bild'];
         $new_width = $_SESSION['thumb_width'];
         $new_height = $_SESSION['thumb_height'];
	//Feststellen der Größe
	$size = getImageSize($datei);
         $width = $size[0];
         $height = $size[1];
         //Erstellen eines neuen leeren Bildes
         $new_image = imagecreatetruecolor($new_width,$new_height);
	//Kopie vom Ursprungsbild erstellen
         $old_image = ImageCreateFromJpeg($datei);
         //Altes Bild verkleinert in das neue hereinkopieren
         ImageCopyResampled($new_image, $old_image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

         //Erstellen und Anzeigen des neuen Bildes
        	header("Content-type: image/jpeg");
         ImageJpeg($new_image);

?>
```

So klappt es nicht. In diesem Falle sieht der die $_SESSION['bild'] Datei scheinbar nicht als Bild.
Wie ist der nötige Zwischenschritt? Auslesen mit fread bekomme ich auch nicht hin.
Wie läufts?


----------



## hasta_jesaja (3. Februar 2008)

Uhm... $_FILES['bild'] enthält nur eine Referenz auf die temporäre Datei, du solltest also die Datei auslesen auf die $_FILES['bild'] zeigt und das in der Session speichern, was die Session aber wiederum unnötig speicher fressen lässt.

Du musst das Bild nach dem Hochladen doch eh irgendwo speichern?
Wenn alles nichts hilft speicher das temporäre Bild irgendwo und lass die bild.php davon das Thumbnail machen.


----------



## holzmensch (3. Februar 2008)

Wenn du es einfach nur verkleinern willst, dann mach es einfach mit den width und height. Dabei kommt das selbe raus, nur ökonomischer. Bilder einfach nur zu verkleinern und auszugeben mit einem PHP Script ist völliger Schwachsinn...


```
<img src="100" height="100" src="deinbild.jpg">
```

holzmensch


----------



## hasta_jesaja (3. Februar 2008)

@holzmensch

Ja schon, aber um das Seitenverhältnis beizubehalten muss er ja auch die Dimensionen des Bildes auslesen und runterrechnen und das dann für jedes Bild (wenns mehrere Thumbnails auf einer Seite sind) und das Bild sieht einfach besser aus wenns nicht "nur" vom Browser skaliert wurde. Ausserdem war mein Anliegen ja eben nicht jedes Bild bei jedem Aufruf erneut zu verkleinern.

Betriff: Ökonomie
Wenn er jedes Bild das demensprechend Groß ist nur per width/height im img Tag verkleinert muss der Client ja bei einer Übersicht von Thumbnails ja immer die große Version laden, was einen großen unterschied machen kann.
Also weder für den Server Traffic noch für den Client Traffic ökonomisch.


----------



## BenschM@ster (3. Februar 2008)

Folgendes ist mein Ziel (um das ganze zu verdeutlichen):
Der User läd ein Bild hoch, sieht eine Vorschau davon.
Er kann jetzt aber noch das Bild ändern.
Da er aber auch andere Daten ändern kann muss der Script feststellen ob ein neues Bild hochgeladen wurde, wenn nicht, dann muss er das alte Bild weiterverwenden (auf den Cache zugreifen).

Ich hab es jetzt doch so gelöst, dass eine Kopie auf dem Server gespeichert wird.
Diese wird beim endgültigen Speichern des Bildes einfach verschoben.
Nachteil ist: Wenn User den Vorgang abbrechen oder aber während des Vorgangs sich für ein anderes Bild entscheiden bleibt eine Dateileiche des Bildes übrig.

Die muss ich dann wohl von Hand löschen.

Danke allen hier,
Gruß,
Ben


----------



## hasta_jesaja (4. Februar 2008)

Naja, wenn dus nicht irgendwo inner Datenbank abgleichen kannst ob das Bild jetzt verwendet wird oder nicht, speicher das Bild halt innem Temp Ordner der von Zeit zu Zeit gelöscht wird z.B. per Cronjob. Um diese Uhrzeiot macht mein Kopf nicht mehr mit , ich werd da Morgen nochmal drüber nachdenken.


----------



## hubbl (4. Februar 2008)

holzmensch hat gesagt.:


> *Bilder einfach nur zu verkleinern und auszugeben mit einem PHP Script ist völliger Schwachsinn...*



Was du da sagst (schreibst ) ist völliger Schwachsinn. 
Bist du schonmal auf ner Gallerie gewesen in der 1600*1200 Bilder angezeigt werden die nur im HTML Code kleiner gemacht sind? Du kannst den Bildern zuschauen wie sich sich langsam aufbauen.. (hab DSL 2000).
Also ist alles schonmal ökonomischer als das was du machen würdest.


----------

