Blog Hoch
Jul 2018·1 tup leghDe'wI' ghItlhta'

Simple Image Resize + Caching

#autoresize#cache-image#php#resize-image-php

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);
chu'OS X Sierra install program version verify laHbe'qanSimple Template Engine