在PHP中裁剪图像

16

我想在PHP中裁剪一张图片并保存文件。我知道应该使用GD库,但不确定如何操作。有什么建议吗?

谢谢


如果您想进行可配置对齐的裁剪,请查看此答案。 - totymedli
6个回答

24

你可以使用 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);
?>

这个方法不会给PNG图像添加黑色背景吗?我的意思是在透明背景上面? - bayblade567
你也可以使用 imagecrop - totymedli

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;
        }
    }

如果计算出偏移量并将其应用于$width和$height变量,就不需要进行多个imagecopyresampled调用,所有操作都可以在一个调用中完成。此外,最好始终强制执行调整大小以确保图像以新格式保存,去除额外的垃圾和头文件,并强制使用特定的质量。 - Exit

1
使用GD裁剪图像需要使用GD方法的组合,如果您查看PHP文档中imagecopyresampled方法的“示例1”,它会向您展示如何裁剪和输出图像,您只需要添加一些代码来捕获并将输出写入文件即可...

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

还有其他选项,包括 Image Magick,如果在您的服务器上安装了它,可以直接使用 PHP 的 exec 方法(或类似方法)访问,或者您可以安装 PHP Imagick 扩展,这将产生更高质量的图像,并且在我看来,更加直观和灵活。

最后,我使用了开源的 PHPThumb 类库,它具有相当简单的界面,并且可以根据服务器上的情况使用多个选项,包括 ImageMagick 和 GD。


0

我在一些项目中使用这个脚本,它非常容易使用: http://shiftingpixel.com/2008/03/03/smart-image-resizer/

该脚本需要 PHP 5.1.0(自2005-11-24发布以来已经过时 - 如果还没有升级到此版本,现在是时候升级了)和 GD(良好的 Web 主机很少缺少)。

以下是在 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" />

shiftingpixel.com 看起来暂时无法访问,请稍后再尝试链接 :) - AlexV
shiftingpixel.com现已恢复:) - AlexV

0

我刚刚创建了这个函数,它可以满足我的需求,创建一个居中且裁剪的缩略图。它非常简洁,不需要像webGautam的答案中那样多次调用imagecopy。

提供图片路径、最终宽度和高度,以及可选的图片质量。我为创建缩略图而制作了这个函数,因此所有图片都保存为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;
}

-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;
    }

如果您在代码中添加注释以解释关键部分的作用,这对用户可能会很有帮助。这将有助于他们更好地理解和应用您的代码。 - shrmn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接