Изменение размера изображений с помощью PHP

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

Благодаря!

Итак, ниже приведен объект 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); ?>" /> 

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

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); ?> 

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

Вот что я использовал

 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(); 

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

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

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

 $magicianObj = new imageLib('racecar.jpg'); $magicianObj -> resizeImage(100, 200, 'crop'); $magicianObj -> saveImage('racecar_small.png');