2010-01-05 5 views
15

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

Благодаря

ответ

23

Вы можете использовать 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 - это 80x40 точек изображения обрезается от исходного изображения

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

Благодарим за быстрый ответ! – user244228

+0

Wont этот метод добавляет черный фон к изображениям PNG? Я имею в виду прозрачный фон? – bayblade567

1

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

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

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

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

0

Я использую этот скрипт в некоторых проектах, и это довольно простой в использовании: 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" /> 
+0

смещениеpixel.com кажется на данный момент попробуйте ссылку позже :) – AlexV

+0

shiftingpixel.com вернулся сейчас :) – AlexV

3

Эта функция будет обрезать изображение сохраняя соотношение сторон изображения :)

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\'t a 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; 
     } 
    } 
+0

Не нужно делать несколько вызовов imagecopyresampled, все это можно сделать при одном вызове, если смещение рассчитано в $ width и $ height. Кроме того, может быть предпочтительнее всегда принудительно изменять размер, чтобы гарантировать сохранение изображения в новом формате, лишенном дополнительного мусора и заголовков, и принудительного к определенному качеству. – Exit

-1

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

/*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; 
    } 
+0

Может быть полезно пользователям, если вы добавите комментарии к своему коду, чтобы объяснить, что делают ключевые части. Это поможет им лучше понять и применить ваш код – shrmn

+0

ok, я добавил –

0

Я только что создал эту функцию, и она работает для моих нужд, создавая центрированные и обрезанные миниатюрное изображение. Он оптимизирован и не требует нескольких вызовов для создания воображения, как показано в ответе 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; 
} 
Смежные вопросы