Как уменьшить изображение на стороне сервера с помощью PHP? - PullRequest
3 голосов
/ 31 января 2012

У меня есть несколько изображений, которые извлекаются с сервера, и $imgUrl содержит путь к изображению.

Сейчас я использую <img src="<?php echo $imgUrl ?>" width="100" height="200"/> или CSS, чтобы уменьшить изображение, но я хочу сделатьэто в PHP, так что я буду обслуживать уже масштабированные изображения в DOM

Любые идеи?

Спасибо

Ответы [ 4 ]

6 голосов
/ 31 января 2012

Это решение приведет к созданию большого пальца при первом запросе.Все будущие запросы будут получать уже созданный большой палец.Используется 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;
2 голосов
/ 31 января 2012

Вы должны создать уменьшенную версию и сохранить ее в папке. Тогда вам не нужно изменять их размер при каждом запросе (это занимает много памяти). Используйте Gd или ImageMagick для изменения размера.

Пример с GD

1 голос
/ 17 декабря 2013

Вот что я использую атм.Не стесняйтесь извлекать вам нужно:

 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);
    }
}
1 голос
/ 31 января 2012

Имейте в виду, что выполнение этого в PHP будет означать процесс, требующий большого объема памяти, каждый раз при обращении к изображению (если оно сделано на лету) или при сохранении изображения (что означает, что вы будете использовать больше памяти для сохранения преобразованного изображений). Если вы все еще уверены, что это то, что вам нужно / нужно, посмотрите на GD . Посмотрите этот ответ для идеи или как это сделать: Размер изображения GD до 100px при сохранении соотношения

...