Simple Image Resize + Caching
reH existing image different size poQ. Photoshop via version Hoch individually crop 'ej website Daq include (Autopush - changed files upload simple Dun) pagh PHP script on-the-fly. performance Dach pagh vaD cache: original image crop neH (desired size already crop pagh vaj). storage space cost 'ach manual version (Photoshop) rap ;-)
wa'DIch .htaccess file poQ: .png, .jpg, .jpeg requests PHP script Daq send (further work Qu'). .htaccess Daq (image file Hoch automatically PHP script pass):
RewriteRule ^(.*)\.(jpg|jpeg|png)/?([0-9]*)?/([0-9]*)?/?([0-1]{1})?$ parse_image.php?i=$1&e=$2&w=$3&h=$4&r=$5 [L,QSA]
parse_image.php path adapt poQ ;-) HTACCESS rule: jpg, jpeg, png extension files intercept 'ej parse_image.php Daq forward. 3 parameters path-style Daq specify laH (PHP script process, bIngDaq). parameters pagh vaj "main image" call (change pagh). parameters:
- output image width (parameter 1)
- height (parameter 2)
- 1 pagh 0 (proportions keep'a' parameter 3)
call:
<img src="images/040.jpg/100/200/1">
images/040.jpg image path, first value (100) output width, second (200) height, third value: proportional scale pagh "cut out". '1' - proportional scale. caching/output script: constant "CACHEFOLDER" adapt poQ (PHP read write access ghaj folder - new image save). constant ALLOWED_TYPES: mime types allowed nuq, not allowed nuq.
# Der Ordner, in dem wir die Bilder cachen
define("CACHEFOLDER", "cache/images/");
# Zugelassene Typen - hier jpeg, jpg und png
define("ALLOWED_TYPES", ['image/jpeg', 'image/jpg', 'image/png']);
# Wir beziehen die GET-Variable r (ratio) und speichern je nach dem ein true oder false in unserer $keep_ratio
$keep_ratio = ($_GET['r'] == '1') ? true : false;
# Es werden die GET-Parameter geholt und in Variablen geschrieben. Muss man natürlich nicht machen, macht den ganzen Vorgang aber übersichtlicher
list($file, $ext, $dimensions['w'], $dimensions['h']) = [$_GET['i'], $_GET['e'], isset($_GET['w']) ? $_GET['w'] : 0, isset($_GET['h']) ? $_GET['h'] : 0];
# Es wird ein MD5-Hash erstellt bestehend aus Dateiname, Zielbreite und Zielhöhe und der Information, ob die Dimensionen erhalten bleiben sollen oder nicht.
$hash = CACHEFOLDER . md5($file.$ext.$dimensions['w'].$dimensions['h'].(($keep_ratio) ? '1' : '0'));
# $file_src enthält den kompletten Pfad zur Originaldatei
$file_src = $file . '.' . $ext;
# Wenn die Originaldatei nicht von einem der o.g. ALLOWED_TYPES ist, brechen wir die Verarbeitung ab (es ist kein png, jpg oder jpeg Bild und höchstwahrscheinlich wurde das Skript direkt aufgerufen)
if (!in_array(mime_content_type($file_src), ALLOWED_TYPES)) die();
# Wenn keine Datei existiert, welche unserem Hash entspricht, dann gibt es keine gecachte Version unseres Bildes und wir erstellen eine.
# Hierzu erstellen wir erst ein jpeg Bild von unserem Originalbild, beziehen die Größe des Bildes und skalieren dann das Bild abhängig von den angegebenen Parametern
if (!file_exists($hash)){
$res['src'] = imagecreatefromjpeg($file_src);
$filedata = getimagesize($file_src);
if ($dimensions['w'] == 0 || $dimensions['h'] == 0) list($dimensions['w'], $dimensions['h']) = [$filedata[0], $filedata[1]];
$res['dst'] = imagecreatetruecolor($dimensions['w'], $dimensions['h']);
if ($keep_ratio === false){
imagecopyresized($res['dst'], $res['src'], 0, 0, 0, 0, $dimensions['w'], $dimensions['h'], $filedata[0], $filedata[1]);
}else{
if ($filedata[0] && $filedata[1]) {
$dst['h'] = $dimensions['h'];
$dst['w'] = floor($filedata[0] * ($dimensions['h'] / $filedata[1]));
$crop['x'] = ceil(($filedata[0] - $filedata[1]) / 2);
$crop['y'] = 0;
}else{
$dst['w'] = $dimensions['w'];
$dst['h'] = floor($filedata[1] * ($dimensions['w'] / $filedata[0]));
$crop['x'] = 0;
$crop['y'] = ceil(($filedata[1] - $filedata[0]) / 2);
}
imagecopyresampled($res['dst'], $res['src'], 0, 0, $crop['x'], $crop['y'], $dst['w'], $dst['h'], $filedata[0], $filedata[1]);
}
# Schlussendlich geben wir unsere Datei aus.
imagejpeg($res['dst'], $hash);
}
header('Content-Type: ' . mime_content_type($hash));
header('Content-Length: ' . filesize($hash));
readfile($hash);