Thumbnails - Ladezeiten

rookie

Erfahrenes Mitglied
Wie siehts mit der Ladezeit aus?

die durch PHP kleinscaliert werden brauchen
relativ lange zum Laden (bzw. das Scalieren so lange dauert).

kann man das so lösen, dass die einmal scalierten Bilder irgendiwe zwischenspeichert werden.

danke schonmal
 
ja, man kann die bilder, anstatt sie an den browser auszugeben auch zwischenspeichern.

wenn du zb auf http://www.php.net/imagejpeg geguckt hättest, dann wüsstest du, dass es einen parameter filename gibt. hier kannst du einen dateinamen angeben.

ich habe mal soetwas geschrieben, die thumbnails sollten eine breite von 100px haben:

thumb.php?path=thumb.jpg
PHP:
function createimage($width, $height){
    $imgh = imagecreate($width, $height);
    $bgc = imagecolorallocate($imgh, 230, 230, 230);
    return $imgh;
}


if(!is_file("thumbnails/".$path.'_thumb'))
{

$img_size = getimagesize($path);
$img_size[4] = $img_size[0]/100;
$faktor = 100/$img_size[4];
$img_size[1] = $img_size[1]/100;
$img_size[0] = $img_size[0]/100;
$img_size[1] = $img_size[1]*$faktor;
$img_size[0] = $img_size[0]*$faktor;

$imgh = createimage($img_size[0], $img_size[1]);
$imgh2 = imagecreatefromjpeg($path);
$imgsz = getimagesize($path);
$black = imagecolorallocate($imgh2, 0, 0, 0);

imagecopyresized($imgh, $imgh2, 0, 0, 0, 0, $img_size[0], $img_size[1], $imgsz[0], $imgsz[1]);

imagejpeg($imgh, "thumbnails/".$path.'_thumb', 75);

header("Content-Type: image/jpeg");
imagejpeg($imgh);
imagedestroy($imgh);

}

else{

header("Content-type: image/jpeg");
$imgh = imagecreatefromjpeg("thumbnails/".$path.'_thumb');
imagejpeg($imgh, '', 75);
imagedestroy($imgh);

}
 
sieht ja alles ganz schoen und gut aus ... das auf PHP.net verteh ich shconmal nicht :P

kannst du noch ne kurze erklärung zu deinem Script geben ? .. was macht das genau ? ...


DANKE
 
Code:
function createimage($width, $height){
    $imgh = imagecreate($width, $height);
    $bgc = imagecolorallocate($imgh, 230, 230, 230);
    return $imgh;
}
Das war die funktion, mit der nachher ein neues bild erstellt wird.

das nach der if schleife wird nur ausgeführt, wenn das thumbnail noch nicht existiert (im verzeichnis "thumbnail")

PHP:
if(!is_file("./thumbnails/".$path.'_thumb')) {

$img_size = getimagesize($path);
$img_size[4] = $img_size[0]/100;
$faktor = 100/$img_size[4];
$img_size[1] = $img_size[1]/100;
$img_size[0] = $img_size[0]/100;
$img_size[1] = $img_size[1]*$faktor;
$img_size[0] = $img_size[0]*$faktor;
Hier wurden gerade die neue länge und breite ausgerechnet, damit man nachher das bild nicht verzerrt sieht, auch bei verschiedenen bildformaten.
PHP:
$imgh = createimage($img_size[0], $img_size[1]);
$imgh2 = imagecreatefromjpeg($path);
$imgsz = getimagesize($path);
$black = imagecolorallocate($imgh2, 0, 0, 0);

imagecopyresized($imgh, $imgh2, 0, 0, 0, 0, $img_size[0], $img_size[1], $imgsz[0], $imgsz[1]);
Das neue, verkleinerte bild wird erstellt und mit einer verkleinerten version des alten gefüllt.
PHP:
imagejpeg($imgh, "thumbnails/".$path.'_thumb', 75);
das bild wird gespeichert
PHP:
header("Content-Type: image/jpeg");
imagejpeg($imgh);
imagedestroy($imgh);
und hier wird es dann nochmal ausgegeben
PHP:
}
das folgende wird nur ausgeführt, wenn die datei schon existiert.
PHP:
else{

header("Content-type: image/jpeg");
$imgh = imagecreatefromjpeg("thumbnails/".$path.'_thumb');
imagejpeg($imgh, '', 75);
imagedestroy($imgh);

}
Die Datei wird geöffnet und gleich wieder ausgegeben.

hoffe, es ist verständlich ;)
 
Tja, da gibs aber ein entscheidendes Problem bei deinem Script brAinstorm, und der ist, dass die GD-Libraray welche für imagejpeg ja benötigt wird seit der Version 1.6 keine GIF-Grafiken mehr unterstützt. Weil das Codierverfahren von GIF patentiert ist, darf er nicht mehr in der GD verwendet werden.

Ich löse dieses Problem aber mit einem externen Programm, welches auf dem Server liegt, dieses Programm heisst ImageMagick und ist ein OpenSource Programm, zu finden unter: http://www.imagemagick.org/

auf dieses Programm kann man im Script über den sytem() Befehl nutzen.

Auf der Seite von ImageMagick wird zwar nichts von PHP gesagt, aber das findest du auf anderen seite, ich hab grad die addresse von der Site wo ich es herhab nicht hir(bin auf arbeit) und werde nachher von zu hause meinen Beitrag abändern, dass du den Link dazu hier finden kannst...


http://www.snipe.net/geek/toolz/imagemagick.php?show_source=yes



Und Ja der System-Befehl ist auf den meisten Providern abgeschaltet, aber auf dem Server den ich mit ein paar Freunden verwalte, da ist er ON :-)
 
Zuletzt bearbeitet:
Tja, da gibs aber ein entscheidendes Problem bei deinem Script brAinstorm, und der ist, dass die GD-Libraray welche für imagejpeg ja benötigt wird.

klar. aber das script funktioniert. das ist nicht das problem. und wer benutzt noch gif? ;)

ich weiß, dass es nicht mehr enthalten ist, deshalb habe ich ja auch jpeg und nicht gif genommen. Und falls es die transparenz unbedingt sein muss, dann geht es doch auch mit png, oder?

es ist nicht wirklich ein problem, nur eine einschränkung. und das script an sich ist in ordnung, da ja auf keine gif funktion zugegriffen wird.

das problem bei deiner variante liegt darin, dass auf vielen provider-servern der system befehl aus sicherheitsgründen gesperrt ist. also ist auch diese lösung nicht wirklich zufriedenstellend.

:p
so. genug gerechtfertigt. ^^
 
Zuletzt bearbeitet:
Da kommt folgender Fehler:
( Aber nur bei manchen Images ).

PHP:
<br>
<b>Warning</b>:  imagecreatefromjpeg: 'Galerien/galerie/thumbnails/gallery_kumcafe.jpg' is not a valid JPEG file in <b>c:\wampp1324\htdocs\scripting\test\thumbnail.php</b> on line <b>60</b><br>
<br>
<b>Warning</b>:  Supplied argument is not a valid Image resource in <b>c:\wampp1324\htdocs\scripting\test\thumbnail.php</b> on line <b>61</b><br>
<br>
<b>Warning</b>:  Supplied argument is not a valid Image resource in <b>c:\wampp1324\htdocs\scripting\test\thumbnail.php</b> on line <b>62</b><br>

Hier die Zeilen 60 - 62

PHP:
} else {
	
	header("Content-type: image/jpeg");
	$imgh = imagecreatefromjpeg("$dir/$subdir/thumbnails/$filename");
	imagejpeg($imgh, '', 75);
	imagedestroy($imgh);

header = 59 ... usw.

thx.
 
mit der Datei geht das .. nur die ist net so schoen ... weil die Thumbnail breite immer 200 px und die Höhe proportional erhalten bleibt.

und da weiss ich halt net wie ich das dann speicher. Ich hab von diesem GDLib keine Ahnung.

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

$vpic = $bild;
// $vpic = "URL des Bildes";

$imm = getimagesize ( $vpic );

$z = $imm[0]/200;
// die 200 gibt die Bild-Breite an!

$img = ImageCreateFromJPEG ( $vpic );

$thumb = ImageCreate ( $imm[0]/$z, $imm[1]/$z );

imagecopyresized ( $thumb, $img, 0, 0, 0, 0, $imm[0]/$z, $imm[1]/$z, $imm[0], $imm[1] );

imagejpeg ( $thumb );
// Ausgeben des Thumbnails

imagedestroy ( $thumb );

imagedestroy ( $img );
 
Zurück