简体   繁体   English

在PHP中裁剪图像

[英]Cropping image in PHP

I'd like crop an image in PHP and save the file. 我想在PHP中裁剪图像并保存文件。 I know your supposed to use the GD library but i'm not sure how. 我知道你应该使用GD库,但我不知道如何。 Any ideas? 有任何想法吗?

Thanks 谢谢

You could use imagecopy to crop a required part of an image. 您可以使用imagecopy来裁剪图像的必需部分。 The command goes like this: 命令如下:

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 
)

Code from PHP.net - a 80x40 px image is cropped from a source image 来自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);
?>

This function will crop image maintaining image aspect ratio :) 此功能将裁剪图像保持图像宽高比:)

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

To crop an image using GD you need to use a combination of GD methods, and if you look at "Example #1" on PHP's documentation of the imagecopyresampled method, it shows you how to crop and output an image, you would just need to add some code to that to capture and write the output to a file... 要使用GD裁剪图像,您需要使用GD方法的组合,如果您在PHP的imagecopyresampled方法文档中查看“示例#1”,它将向您展示如何裁剪和输出图像,您只需要添加一些代码来捕获并将输出写入文件...

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

There are also other options, including Image Magick which, if installed on your server, can be accessed directly using PHP's exec method (or similar) or you can install the PHP Imagick extension, which yields higher quality images and, in my opinion, is a little more intuitive and flexible to work with. 还有其他选项,包括Image Magick ,如果安装在你的服务器上,可以使用PHP的exec方法(或类似方法)直接访问,或者你可以安装PHP Imagick扩展,它可以产生更高质量的图像,在我看来,是使用起来更直观,更灵活。

Finally, I've used the open source PHPThumb class library, which has a pretty simple interface and can work with multiple options depending on what's on your server, including ImageMagick and GD. 最后,我使用了开源PHPThumb类库,它具有非常简单的界面,可以根据服务器上的内容使用多个选项,包括ImageMagick和GD。

I use this script in some projects and it's pretty easy to use: http://shiftingpixel.com/2008/03/03/smart-image-resizer/ 我在一些项目中使用这个脚本,它很容易使用: http//shiftingpixel.com/2008/03/03/smart-image-resizer/

The script requires PHP 5.1.0 (which is out since 2005-11-24 - time to upgrade if not yet at this version) and GD (which is rarely missing from good Web hosts). 该脚本需要PHP 5.1.0(自2005-11-24以来已经出来 - 如果尚未在此版本升级的时间)和GD(良好的Web主机很少丢失)。

Here is an example of it's use in your HTML: 以下是在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" />

I just created this function and it works for my needs, creating a centered and cropped thumbnail image. 我刚刚创建了这个功能,它可以满足我的需求,创建一个居中和裁剪的缩略图。 It is streamlined and doesn't require multiple imagecopy calls like shown in webGautam's answer. 它是简化的,不需要像webGautam的答案中所示的多个图像复制调用。

Provide the image path, the final width and height, and optionally the quality of the image. 提供图像路径,最终宽度和高度,以及可选的图像质量。 I made this for creating thumbnails, so all images are saved as JPGs, you can edit it to accommodate other image types if you require them. 我这样做是为了创建缩略图,因此所有图像都保存为JPG,如果需要,可以编辑它以适应其他图像类型。 The main point here is the math and method of using imagecopyresampled to produce a thumbnail. 这里的要点是使用imagecopyresampled生成缩略图的数学和方法。 Images are saved using the same name, plus the image size. 使用相同的名称和图像大小保存图像。

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

You can use below method to crop image, 您可以使用以下方法裁剪图像,

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM