在 PHP 中裁剪图像
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2008911/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Cropping image in PHP
提问by user244228
I'd like crop an image in PHP and save the file. I know your supposed to use the GD library but i'm not sure how. Any ideas?
我想用 PHP 裁剪图像并保存文件。我知道您应该使用 GD 库,但我不确定如何使用。有任何想法吗?
Thanks
谢谢
回答by Andris
You could use imagecopyto crop a required part of an image. The command goes like this:
您可以使用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
)
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);
?>
回答by webGautam
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;
}
}
回答by Chris Forrette
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 imagecopyresampledmethod, 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 方法的组合,如果您查看该imagecopyresampled方法的PHP 文档中的“示例 #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 Magickwhich, if installed on your server, can be accessed directly using PHP's execmethod (or similar) or you can install the PHP Imagickextension, 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 PHPThumbclass 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。
回答by AlexV
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&height=200&image=/wp-content/uploads/2008/03/coffee-bean.jpg" alt="Coffee Bean" />
回答by Exit
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 的回答中所示的多个 imagecopy 调用。
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. The main point here is the math and method of using imagecopyresampled to produce a thumbnail. Images are saved using the same name, plus the image size.
提供图像路径、最终宽度和高度,以及可选的图像质量。我这样做是为了创建缩略图,因此所有图像都保存为 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;
}
回答by Parvez Alam
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;
}

