Изменение размера изображений с помощью PHP - PullRequest
2 голосов
/ 13 сентября 2011

У меня есть быстрый вопрос, который я не совсем уверен, чтобы установить.Я видел примеры в другом месте, но ничего такого, как моя ситуация.Я хотел бы изменить размеры изображений с помощью PHP, чтобы они были удобочитаемыми, а не просто растянутыми, как при использовании HTML.Если они не имеют ширину 250 пикселей или высоту 160 пикселей, как я могу изменить размер изображения, чтобы оно было пропорциональным, но вписывалось в это пространство?

Спасибо!

Ответы [ 6 ]

6 голосов
/ 13 сентября 2011

PHP не манипулирует изображениями напрямую.Для достижения этой цели вам понадобится использовать библиотеку манипуляций с изображениями, например gd или ImageMagick .

В ImageMagick изменение размера изображения выполненовот так:

$thumb = new Imagick('myimage.gif');

$thumb->resizeImage(320,240,Imagick::FILTER_LANCZOS,1);
$thumb->writeImage('mythumb.gif');

С помощью GD вы можете сделать это так :

<?php
// The file
$filename = 'test.jpg';
$percent = 0.5;

// Content type
header('Content-Type: image/jpeg');

// Get new dimensions
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;

// Resample
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

// Output
imagejpeg($image_p, null, 100);
?>
4 голосов
/ 13 сентября 2011

Хорошо, ниже представлен объект Image, который я использую в своем магазине.Он поддерживает масштаб - требует GD

<?php
class Store_Model_Image extends My_Model_Abstract 
{
    const PATH  = STORE_MODEL_IMAGE_PATH;
    const URL   = "/store-assets/product-images/";

    public function get_image_url($width, $height)
    {
        $old_file = self::PATH . $this->get_filename();
        $basename = pathinfo($old_file, PATHINFO_FILENAME);

        $new_name = sprintf("%s_%sx%s.jpg", $basename, $width, $height);
        if(file_exists(self::PATH . $new_name))
        {
            return self::URL . $new_name;
        }
        else
        {
            list($width_orig, $height_orig, $image_type) = @getimagesize($old_file);
            $img = FALSE;

            // Get the image and create a thumbnail     
            switch($image_type)
            {
                case 1:
                    $img = @imagecreatefromgif($old_file);
                    break;
                case 2:
                    $img = @imagecreatefromjpeg($old_file);
                    break;
                case 3: 
                    $img = @imagecreatefrompng($old_file);
                    break;
            }

            if(!$img)
            {
                throw new Zend_Exception("ERROR: Could not create image handle from path.");
            }

            // Build the thumbnail
            if($width_orig > $height_orig)
            {
                $width_ratio = $width / $width_orig;
                $new_width   = $width;
                $new_height  = $height_orig * $width_ratio;
            }
            else
            {
                $height_ratio = $height / $height_orig;
                $new_width    = $width_orig * $height_ratio;
                $new_height   = $height;
            }

            $new_img = @imagecreatetruecolor($new_width, $new_height);

            // Fill the image black
            if(!@imagefilledrectangle($new_img, 0, 0, $new_width, $new_height, 0))
            {           
                throw new Zend_Exception("ERROR: Could not fill new image");
            }

            if(!@imagecopyresampled($new_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig))
            {
                throw new Zend_Exception("ERROR: Could not resize old image onto new bg.");
            }

            // Use a output buffering to load the image into a variable
            ob_start();
            imagejpeg($new_img, NULL, 100);
            $image_contents = ob_get_contents();
            ob_end_clean();

            // lastly (for the example) we are writing the string to a file
            $fh = fopen(self::PATH . $new_name, "a+");
            fwrite($fh, $image_contents);
            fclose($fh);

            return self::URL . $new_name;
        }
    }
}

Я изменяю размер изображения во время запроса, поэтому при первой загрузке страницы изображение будет изменено до требуемого размера для шаблона.(это означает, что мне не нужно аварийно завершать работу общего хоста, пытающегося восстанавливать миниатюры изображений при каждом изменении моего дизайна)

Таким образом, в шаблоне вы передаете объект изображения, а когда вам нужен большой палец изображения,

<img src="<?php echo $image->get_image_url(100, 100); ?>" />

теперь у вас есть большой палец 100x100, который сохраняется на сервере для повторного использования в более поздний срок

1 голос
/ 13 сентября 2011

gd и imagemagick - это два инструмента, которые могут работать для вас

0 голосов
/ 31 июля 2012

Есть простая в использовании библиотека с открытым исходным кодом, которая называется PHP Image Magician , которая может вам помочь.

Пример использования базы:

$magicianObj = new imageLib('racecar.jpg');
$magicianObj -> resizeImage(100, 200, 'crop');
$magicianObj -> saveImage('racecar_small.png');
0 голосов
/ 13 сентября 2011

Используйте GD или ImageMagick. Здесь вы можете найти реальный производственный пример кода (используемого MediaWiki), который поддерживает интерфейс консоли ImageMagick (метод transformImageMagick), интерфейс расширения ImageMagick (метод transformImageMagickExt) и GD (метод transformGd).

0 голосов
/ 13 сентября 2011

Вот кое-что, что я использовал

class cropImage{

    var $imgSrc,$myImage,$cropHeight,$cropWidth,$x,$y,$thumb;  

    function setImage($image,$moduleWidth,$moduleHeight,$cropPercent = "1") {

        //Your Image
        $this->imgSrc = $image; 

        //getting the image dimensions
        list($width, $height) = getimagesize($this->imgSrc); 

        //create image from the jpeg
        $this->myImage = imagecreatefromjpeg($this->imgSrc) or die("Error: Cannot find image!"); 

         if($width > $height) $biggestSide = $width; //find biggest length
         else $biggestSide = $height; 

        //The crop size will be half that of the largest side 
        //$cropPercent = 1.55; // This will zoom in to 50% zoom (crop)

        if(!$cropPercent) {
            $cropPercent = 1.50;
        }

        $this->cropWidth   = $moduleWidth*$cropPercent; 
        $this->cropHeight  = $moduleHeight*$cropPercent; 
        //$this->cropWidth   = $biggestSide*$cropPercent; 
        //$this->cropHeight  = $biggestSide*$cropPercent; 


        //getting the top left coordinate
        $this->x = ($width-$this->cropWidth)/2;
        $this->y = ($height-$this->cropHeight)/2;

    }  

    function createThumb($moduleWidth,$moduleHeight){

        $thumbSize = 495; // will create a 250 x 250 thumb
        $this->thumb = imagecreatetruecolor($moduleWidth, $moduleHeight); 
        //$this->thumb = imagecreatetruecolor($thumbSize, $thumbSize); 

        imagecopyresampled($this->thumb, $this->myImage, 0, 0,$this->x, $this->y, $moduleWidth, $moduleHeight, $this->cropWidth, $this->cropHeight); 
        //imagecopyresampled($this->thumb, $this->myImage, 0, 0,$this->x, $this->y, $thumbSize, $thumbSize, $this->cropWidth, $this->cropHeight); 
    }  

    function renderImage(){
        header('Content-type: image/jpeg');
        imagejpeg($this->thumb);
        imagedestroy($this->thumb); 
    }  

}  

Позвоните, используя

$image = new cropImage;
$image->setImage($imagepath,$moduleWidth,$moduleHeight,$scaleRelation);
$image->createThumb($moduleWidth,$moduleHeight);
$image->renderImage();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...