Обрезание изображения в PHP

Я хотел бы обрезать изображение в PHP и сохранить файл. Я знаю, что вы должны использовать библиотеку GD, но я не знаю, как это сделать. Есть идеи?

благодаря

Вы можете использовать imagecopy для обрезки необходимой части изображения. Команда выглядит следующим образом:

 imagecopy ( resource $dst_im - the image object , resource $src_im - destination image , int $dst_x - x coordinate in the destination image (use 0) , int $dst_y - y coordinate in the destination image (use 0) , int $src_x - x coordinate in the source image you want to crop , int $src_y - y coordinate in the source image you want to crop , int $src_w - crop width , int $src_h - crop height ) 

Код из PHP.net – изображение размером 80×40 пикселей обрезано из исходного изображения

 <?php // Create image instances $src = imagecreatefromgif('php.gif'); $dest = imagecreatetruecolor(80, 40); // Copy imagecopy($dest, $src, 0, 0, 20, 13, 80, 40); // Output and free from memory header('Content-Type: image/gif'); imagegif($dest); imagedestroy($dest); imagedestroy($src); ?> 

Эта функция будет обрезать изображение, поддерживающее соотношение сторон изображения 🙂

  function resize_image_crop($image, $width, $height) { $w = @imagesx($image); //current width $h = @imagesy($image); //current height if ((!$w) || (!$h)) { $GLOBALS['errors'][] = 'Image couldn\'t be resized because it wasn\'ta valid image.'; return false; } if (($w == $width) && ($h == $height)) { return $image; } //no resizing needed $ratio = $width / $w; //try max width first... $new_w = $width; $new_h = $h * $ratio; if ($new_h < $height) { //if that created an image smaller than what we wanted, try the other way $ratio = $height / $h; $new_h = $height; $new_w = $w * $ratio; } $image2 = imagecreatetruecolor ($new_w, $new_h); imagecopyresampled($image2,$image, 0, 0, 0, 0, $new_w, $new_h, $w, $h); if (($new_h != $height) || ($new_w != $width)) { //check to see if cropping needs to happen $image3 = imagecreatetruecolor ($width, $height); if ($new_h > $height) { //crop vertically $extra = $new_h - $height; $x = 0; //source x $y = round($extra / 2); //source y imagecopyresampled($image3,$image2, 0, 0, $x, $y, $width, $height, $width, $height); } else { $extra = $new_w - $width; $x = round($extra / 2); //source x $y = 0; //source y imagecopyresampled($image3,$image2, 0, 0, $x, $y, $width, $height, $width, $height); } imagedestroy($image2); return $image3; } else { return $image2; } } 

Чтобы обрезать изображение с помощью GD, вам нужно использовать комбинацию методов GD, и если вы посмотрите на «Пример №1» в документации PHP на метод imagecopyresampled , он покажет вам, как обрезать и выводить изображение, вам просто нужно будет добавьте код для этого, чтобы захватить и записать вывод в файл …

http://us2.php.net/manual/en/function.imagecopyresampled.php

Существуют также другие варианты, в том числе Image Magick, которые, если они установлены на вашем сервере, могут быть доступны напрямую с помощью метода exec (или аналогичного метода PHP) или вы можете установить расширение PHP Imagick , которое дает изображения более высокого качества и, на мой взгляд, немного более интуитивно понятным и гибким для работы.

Наконец, я использовал библиотеку классов PHPThumb с открытым исходным кодом , которая имеет довольно простой интерфейс и может работать с несколькими параметрами в зависимости от того, что находится на вашем сервере, включая ImageMagick и GD.

Я использую этот скрипт в некоторых проектах, и его довольно легко использовать: http://shiftingpixel.com/2008/03/03/smart-image-resizer/

Для скрипта требуется PHP 5.1.0 (который отсутствует с 2005-11-24 – время для обновления, если еще нет в этой версии) и GD (который редко отсутствует на хороших веб-хостах).

Вот пример его использования в вашем HTML:

 <img src="/image.php/coffee-bean.jpg?width=200&amp;height=200&amp;image=/wp-content/uploads/2008/03/coffee-bean.jpg" alt="Coffee Bean" /> 

Я только что создал эту функцию, и она работает для моих нужд, создавая эскиз с центрированным и обрезанным миниатюрным изображением. Он оптимизирован и не требует нескольких вызовов для создания воображения, как показано в ответе webGautam.

Укажите путь изображения, конечную ширину и высоту и, возможно, качество изображения. Я сделал это для создания эскизов, поэтому все изображения сохраняются как JPG, вы можете отредактировать их для размещения других типов изображений, если они вам нужны. Главное здесь – математика и метод использования imagecopyresampled для создания миниатюры. Изображения сохраняются с тем же именем, плюс размер изображения.

 function resize_crop_image($image_path, $end_width, $end_height, $quality = '') { if ($end_width < 1) $end_width = 100; if ($end_height < 1) $end_height = 100; if ($quality < 1 || $quality > 100) $quality = 60; $image = false; $dot = strrpos($image_path,'.'); $file = substr($image_path,0,$dot).'-'.$end_width.'x'.$end_height.'.jpg'; $ext = substr($image_path,$dot+1); if ($ext == 'jpg' || $ext == 'jpeg') $image = @imagecreatefromjpeg($image_path); elseif($ext == 'gif') $image = @imagecreatefromgif($image_path); elseif($ext == 'png') $image = @imagecreatefrompng($image_path); if ($image) { $width = imagesx($image); $height = imagesy($image); $scale = max($end_width/$width, $end_height/$height); $new_width = floor($scale*$width); $new_height = floor($scale*$height); $x = ($new_width != $end_width ? ($width - $end_width) / 2 : 0); $y = ($new_height != $end_height ? ($height - $end_height) / 2 : 0); $new_image = @imagecreatetruecolor($new_width, $new_height); imagecopyresampled($new_image,$image,0,0,$x,$y,$new_width,$new_height,$width - $x,$height - $y); imagedestroy($image); imagejpeg($new_image,$file,$quality); imagedestroy($new_image); return $file; } return false; } 

Вы можете использовать метод ниже для обрезки изображения,

 /*parameters are $image =source image name $width = target width $height = height of image $scale = scale of image*/ function resizeImage($image,$width,$height,$scale) { //generate new image height and width of source image $newImageWidth = ceil($width * $scale); $newImageHeight = ceil($height * $scale); //Create a new true color image $newImage = imagecreatetruecolor($newImageWidth,$newImageHeight); //Create a new image from file $source = imagecreatefromjpeg($image); //Copy and resize part of an image with resampling imagecopyresampled($newImage,$source,0,0,0,0,$newImageWidth,$newImageHeight,$width,$height); //Output image to file imagejpeg($newImage,$image,90); //set rights on image file chmod($image, 0777); //return crop image return $image; }