У меня есть некоторые изображения, которые вытаскиваются с сервера, а $imgUrl
– путь к изображению.
Прямо сейчас я использую <img src="<?php echo $imgUrl ?>" width="100" height="200"/>
или CSS для масштабирования изображения, но я хочу сделать это в PHP, чтобы я подавать уже масштабированные изображения в DOM
Есть идеи?
благодаря
Это решение приведет к тому, что большой палец будет создан, когда он будет запрошен в первый раз. Все будущие запросы получат уже созданный большой палец. Он использует ImageMagick :
HTML:
<img src="script.php?img=example" />
PHP (script.php):
$width = 140; $height = 80; $image = $_GET['img']; $ext = 'png'; // Check if file exists if ( ! file_exists('/path/to/the/'.$image.'.'.$ext)) { die('Unable to process the requested file.'); } // Check if a thumb already exists, otherwise create a thumb if (file_exists('/path/to/the/'.$image.'_thumb.'.$ext)) { $img = new imagick('/path/to/the/'.$image.'_thumb.'.$ext); } else { $img = new imagick('/path/to/the/'.$image.'.'.$ext); $img->setImageFormat($ext); $img->scaleImage($width, 0); $img->cropImage($width, $height, 0, 0); $img->writeImage('/path/to/the/'.$image.'_thumb.'.$ext); } // Return as an image header('Content-Type: image/'.$ext); echo $img;
Вы должны создать меньшую версию и сохранить ее в папке. Тогда вам не нужно их настраивать по каждому запросу (это интенсивная память). Используйте Gd или ImageMagick для изменения размера.
Пример с GD
Имейте в виду, что выполнение этого в PHP будет означать интенсивный процесс памяти либо при каждом обращении к изображению (если это выполняется «на лету»), либо при сохранении изображения (что означает, что вы будете использовать больше хранилища для сохранения преобразованных изображений). Если вы все еще уверены, что это то, что вам нужно / нужно, посмотрите на использование GD . См. Этот ответ для идеи или как это сделать: Image GD resize to 100px, сохраняя соотношение
Вот что я использую atm. Не стесняйтесь извлекать ваши потребности:
Usage: <CLASS>::scale_image($dir.$name, 1024, 768, $dir.'thumb_'.$name); /** * Most simple way to get File Extension * @param string $path Local path to File * @return string Extension in lower case */ public static function extension($path){ return strtolower(pathinfo($path, PATHINFO_EXTENSION)); } /** * Rename Filename for more secure usage * @param string $name filename * @return string more secure filename */ public static function secure_name($name){ return urlencode(preg_replace('/[^a-z0-9 \-_\.]/i', '_', strtolower($name))); } /** * Scale Image without ratio changes * @param int $sw source width of orig image * @param int $sh source height of orig image * @param int $tw max target width * @param int $th max target height * @return array list($width, $height) */ public static function scale($sw, $sh, $tw, $th){ if ($sw > $tw && $sw/$tw > $sh/$th) { $tw = $sw * ($tw / $sw); $th = $sh * ($tw / $sw); }else if ($sh > $th) { $tw = $sw * ($th / $sh); $th = $sh * ($th / $sh); }else{ $th = $sh; $tw = $sw; } return array(round($tw), round($th)); } /** * Scale Image * @param string $sPath * @param int $width max width * @param int $height max height * @param string $tPath Optional Path for Thumbnail * @param int $thumbScale Scale ratio for optional Thumbnail (Width and Height / $thumbScale) * @return void */ public static function scale_image($sPath, $width, $height, $tPath = NULL, $thumbScale = 10){ if(!function_exists('imagecreatetruecolor')){ return; } $ext = strtolower(self::extension($sPath)); if($ext == 'jpg' or $ext == 'jpeg'){ $src = imagecreatefromjpeg($sPath); }elseif($ext == 'png'){ $src = imagecreatefrompng($sPath); }elseif($ext == 'gif'){ $src = imagecreatefromgif($sPath); }else{ return; } list($sw, $sh) = getimagesize($sPath); list($tw, $th) = File::scale($sw, $sh, $width, $height); $trg = imagecreatetruecolor($tw, $th); imagecopyresampled($trg, $src, 0, 0, 0, 0, $tw, $th, $sw, $sh); imagejpeg($trg, $sPath, 90); if($tPath){ $tw = (int)$tw / $thumbScale; $th = (int)$th / $thumbScale; $trg = imagecreatetruecolor($tw, $th); imagecopyresampled($trg, $src, 0, 0, 0, 0, $tw, $th, $sw, $sh); imagejpeg($trg, $tPath, 90); } }