Thumbs ohne Cache
Dennis
- php
Hallo,
habe ein wirklich klasse thumb-PHP-Script gefunden, würde das nur gerne ohne die cache-Funktion benutze.
Kann mir jemand sagen, wie ich den folgenden Code umbauen muss, damit das Bild ohne zu cachen direkt ausgegeben wird - weiß zwar, dass das nicht so gut ist, soll aber lokal laufen ...
<?php
/*##############################################
# - Thumbnail-Script v1.3 - #
# Generating thumbnails 'on-the-fly' with PHP #
# #
# (c) by Christian Lamine, FlashDreams OHG #
# http://www.flashdreams.de/ #
# #
# This script may be freely used, distributed #
# and modified without any charge as long as #
# this copyright information is included. #
# #
# Any commercial selling of this script is #
# prohibited. #
# #
# The author is not responsible for possible #
# damage which may result from the application #
# of this script, neither direct nor indirect. #
# Use at your own risk! #
##############################################*/
error_reporting(0);
$types = array (1 => "gif", "jpeg", "png", "swf", "psd", "wbmp");
define ('cache', 'cache/');
$cachedir = substr($HTTP_GET_VARS['image'],0,strrpos($HTTP_GET_VARS['image'],'/') + 1).cache;
!is_dir ($cachedir)
? mkdir ($cachedir, 0777)
: system ("chmod 0777 ".$cachedir);
(!isset ($x) || ereg ('[1]{1,}$', $x, $regs)) &&
(!isset ($y) || ereg ('[2]{1,}$', $y, $regs)) &&
(isset ($x) || isset ($y))
? true
: DIE ('Fehlende(r) oder ungültige(r) Größenparameter!');
!isset ($resize) || !ereg ('[3]$', $resize, $regs)
? $resize = 0
: $resize;
!isset ($aspectratio) || !ereg ('[4]$', $aspectratio, $regs)
? isset ($x) && isset ($y)
? $aspectratio = 1
: $aspectratio = 0
: $aspectratio;
!isset ($image)
? DIE ('Es wurde kein Bild angegeben!')
: !file_exists($image)
? DIE ('Die angegebene Datei konnte nicht auf dem Server gefunden werden!')
: false;
$imagedata = getimagesize($image);
!$imagedata[2] || $imagedata[2] == 4 || $imagedata[2] == 5
? DIE ('Bei der angegebenen Datei handelt es sich nicht um ein Bild!')
: false;
eval ('
if (!(imagetypes() & IMG_'.strtoupper($types[$imagedata[2]]).')) {
DIE ("Das ".strtoupper($types[$imagedata[2]])."-Format wird nicht unterstützt!");
}
');
!isset ($x)
? $x = floor ($y * $imagedata[0] / $imagedata[1])
: $x;
!isset ($y)
? $y = floor ($x * $imagedata[1] / $imagedata[0])
: $y;
if ($aspectratio && isset ($HTTP_GET_VARS['x']) && isset ($HTTP_GET_VARS['y'])) {
if ($imagedata[0] > $imagedata[1]) {
$y = floor ($x * $imagedata[1] / $imagedata[0]);
} else if ($imagedata[1] > $imagedata[0]) {
$x = floor ($y * $imagedata[0] / $imagedata[1]);
}
}
$thumbfile = substr ($HTTP_GET_VARS['image'], strrpos ($HTTP_GET_VARS['image'], '/') + 1);
if (file_exists ($cachedir.$thumbfile)) {
$thumbdata = getimagesize ($cachedir.$thumbfile);
$thumbdata[0] == $x && $thumbdata[1] == $y
? $iscached = true
: $iscached = false;
} else {
$iscached = false;
}
if (!$iscached) {
($imagedata[0] > $x || $imagedata[1] > $y) ||
(($imagedata[0] < $x || $imagedata[1] < $y) && $resize)
? $makethumb = true
: $makethumb = false;
} else {
$makethumb = false;
}
Header ("Content-Type: image/".$types[$imagedata[2]]);
if ($makethumb) {
$image = call_user_func("imagecreatefrom".$types[$imagedata[2]], $image);
$thumb = imagecreate ($x, $y);
imagecopyresized ($thumb, $image, 0, 0, 0, 0, $x, $y, $imagedata[0], $imagedata[1]);
call_user_func("image".$types[$imagedata[2]], $thumb, $cachedir.$thumbfile);
imagedestroy ($image);
imagedestroy ($thumb);
$image = $cachedir.$thumbfile;
} else {
$iscached
? $image = $cachedir.$thumbfile
: $image = $HTTP_GET_VARS['image'];
}
$image = fopen ($image, "rb");
fpassthru ($image);
fclose ($image);
?>
Ich danke recht herzlich,
Dennis
Hallo, Dennis,
ich musste den Code radikal umschreiben, er war wirklich grausig... wie kann man nur durchgehend anstatt if-Anweisungen dreifach konditionale Operatoren verwenden, dazu ist noch kein Stück im Script kommentiert, bäh... naja, hier das neue Script:
<?php
/*##############################################
# - Thumbnail-Script v1.3 - #
# Generating thumbnails 'on-the-fly' with PHP #
# #
# (c) by Christian Lamine, FlashDreams OHG #
# http://www.flashdreams.de/ #
# #
# This script may be freely used, distributed #
# and modified without any charge as long as #
# this copyright information is included. #
# #
# Any commercial selling of this script is #
# prohibited. #
# #
# The author is not responsible for possible #
# damage which may result from the application #
# of this script, neither direct nor indirect. #
# Use at your own risk! #
##############################################*/
error_reporting(0);
$types=array (1 => 'gif', 'jpeg', 'png', 'swf', 'psd', 'wbmp');
// Ich bin mir unsicher, wie man diesen Ausdruck positivieren kann;
// einer oder beide GET-Parameter müssen angegeben sein und Zahlen sein.
// Ich habe ihn erst einmal unverändert übernommen, denn ich hätte
// ihn nur durch zwei If-Anweisungen ersetzen können. --molily
if (
(!isset($_GET['x']) || preg_match('~[1]+$~', $_GET['x'])) &&
(!isset($_GET['y']) || preg_match('~[2]+$~', $_GET['y'])) &&
(isset($_GET['x']) || isset($_GET['y']))
) {} else {die ('Fehlende(r) oder ungültige(r) Größenparameter!');}
if (!isset($_GET['resize']) || !preg_match('~[3]$~', $_GET['resize']))
$resize=0;
if (!isset($_GET['aspectratio']) || !preg_match('~[4]$~', $_GET['aspectratio']))
if (isset($_GET['x']) && isset($_GET['y']))
$aspectratio=true;
else
$aspectratio=false;
if (!isset($_GET['image'])) {
die('Es wurde kein Bild angegeben!');
} else {
if (!file_exists($_GET['image']))
die('Die angegebene Datei konnte nicht auf dem Server gefunden werden!');
}
$imagedata=getimagesize($image);
if (!$imagedata[2] || $imagedata[2]==4 || $imagedata[2]==5)
die('Bei der angegebenen Datei handelt es sich nicht um ein Bild!');
eval ('
if (!(imagetypes() & IMG_'.strtoupper($types[$imagedata[2]]).')) die ("Das ".strtoupper($types[$imagedata[2]])."-Format wird nicht unterstützt!");
');
if (!isset($_GET['x'])) $x=floor($_GET['y'] * $imagedata[0] / $imagedata[1]);
if (!isset($_GET['y'])) $y=floor ($_GET['x'] * $imagedata[1] / $imagedata[0]);
if ($aspectratio && isset($_GET['x']) && isset ($_GET['y'])) {
if ($imagedata[0] > $imagedata[1]) {
$y=floor($_GET['x'] * $imagedata[1] / $imagedata[0]);
} elseif ($imagedata[1] > $imagedata[0]) {
$x=floor($_GET['y'] * $imagedata[0] / $imagedata[1]);
}
}
header('Content-Type: image/'.$types[$imagedata[2]]);
$image=call_user_func('imagecreatefrom'.$types[$imagedata[2]], $image);
$thumb=imagecreate ($x, $y);
imagecopyresized($thumb, $image, 0, 0, 0, 0, $x, $y, $imagedata[0], $imagedata[1]);
call_user_func('image'.$types[$imagedata[2]], $thumb);
imagedestroy ($image);
imagedestroy ($thumb);
?>
Wenn's nicht funktioniert, frage noch einmal, ich habe es hier auf dem PHP 4.2.3 (Win32) als Apache-Modul getestet, mit Safe Mode an und register_globals aus, AFAIR.
Mathias
Hallo molily,
ich musste den Code radikal umschreiben, er war wirklich grausig... wie kann man nur durchgehend anstatt if-Anweisungen dreifach konditionale Operatoren verwenden, dazu ist noch kein Stück im Script kommentiert, bäh... naja, hier das neue Script
Ein bisschen PHP verstehe ich ja, aber mit dieser Schreibweise kam ich garnicht klar.
Dein Script läuft super! Erstmal tausend Dank.
Ich würde jetzt noch gerne die Qualität der Bilder einstellen - geht das mit dem Script? Kann man diese Funktion noch hinzufügen?
Bis dann,
Dennis
Hallo, Dennis.
Ich würde jetzt noch gerne die Qualität der Bilder einstellen - geht das mit dem Script? Kann man diese Funktion noch hinzufügen?
Als Parameter erwartet das Script die Höhe (GET-Parameter 'x'), die Breite ('y') und/oder optional 'aspectratio. Wenn aspectratio den Wert 1 hat (Standard) und x und y gesetzt sind , wird je nach den Ausmaßen des Bildes die kürzere Seite (IIRC) anhand des jeweils anderen Parameters gemäß dem Seitenverhältnis des Originalbildes berechnet und der übergebene x- bzw. y-Wert ignoriert. Wenn aspectratio den Wert 0 (null) trägt, werden die übergebenen Parameter nicht gegen das Seitenverhältnis geprüft und das Bild wird ggf. unverhältnismäßig vergrößert oder gestaucht.
Angenommen bildname.jpg hat die Ausmaße 640x480:
thumbnail.php?image=bildname.jpg&x=320&y=320 (&aspectratio=1)
würde ein Bild 320x200 produzieren, da das Seitenverhältnis berücksichtigt würde.
thumbnail.php?image=bildname.jpg&x=320&y=320&aspectratio=0
würde ein Bild mit den angegebenen Ausmaßen 320x320 liefern.
Aber das meintest du wohl gar nicht mit Qualität... :)
Momentan verwendet das Script die Funktion imagecopyresized() http://de.php.net/manual/de/function.imagecopyresized.php zum skalieren, d.h. es ist wahrscheinlich eine Pixelskalierung ohne Interpolation und "Smoothing" oder wie immer man das nennt. Ich kenne mich mit der GD-Library nicht sonderlich aus, aber ich habe letztens ein wenig gestöbert, da ich ähnliches vorhatte. Eventuell kannst du imagecopyresized() durch imagecopyresampled() http://de.php.net/manual/de/function.imagecopyresampled.php ersetzen bzw. das Script dementsprechend abändern. Wie es aussieht ist das die bessere Funktion dafür: "imagecopyresampled() copies a rectangular portion of one image to another image, smoothly interpolating pixel values so that, in particular, reducing the size of an image still retains a great deal of clarity." Sicherlich dauert diese Art des Resamplen aber enorm länger als bei der Verwendung von imagecopyresized().
In bin momentan ein bisschen verwirrt, weil das Script (die imagecopy*-Funktion, das Script macht alles richtig AFAIK) bei bestimmten Bildern nur ein schwarzes oder blaues Bild liefert, oder völlig verzerrte Farben.
Mathias
P.S. Wenn jemand mitliest, der öfter mit der GD-Bibliothek arbeitet und sich mehr als ich auskennt, soll dieser Jemand bitte einmal kommentieren, wieso die genannten Fehler auftreten.
Hallo nochmal,
imagecopyresampled()
were ich mal austesten!
In bin momentan ein bisschen verwirrt, weil das Script (die imagecopy*-Funktion, das Script macht alles richtig AFAIK) bei bestimmten Bildern nur ein schwarzes oder blaues Bild liefert, oder völlig verzerrte Farben.
Das Problem habe ich nicht! Allerdings benutze ich auch nur JPGs...
Danke nachmal,
Bis dann,
Dennis