PHP 裁剪图片到指定大小

作者: jaclon 分类: PHP 发布时间: 2011-10-05 19:49 ė 612条评论

在展示图片的时候往往会遇到这样的问题,图片的比例与展示容器的比例不一致;一般都有以下解决方案

1.图片全部展示出来,但容器有留有空白边,如下图

全部展示

2.缩放至填满容器,部分隐藏(取左上角部分)

部分展示

如图所示,图片1放大至能填满容器,红色框外部分隐藏

3.第三种方法跟第二种相似,剪裁并生成合适大小的缩略图

即把上图中的红色框中的图片裁剪出来生成缩略图

4.第四种方法是今天要说的方法,也是剪裁生成缩略图,只是裁剪的不是左上角,而中间部分

中间裁剪

如图所示,缩放图片至合适大小,并裁剪中部生成缩略图,与第三种方法相比更能显示图片的重点部分(一般重点内容都在图片中心位置)

以方法可用于一般的生成缩略图,也可用于生成静态页面时将部分图片生成合适大小的缓存文件。下面给出裁剪代码:

 /**
 * 修剪图片到合适大小
 * 
 * @param string $original  原始图片路径
 * @param int $width        目标图片宽度
 * @param int $height       目标图片高度
 * @param boolean $cut    是否进行剪裁
 */
function crop($original,$width,$height,$cut=0)
{
 if (!file_exists($original))
 {
 return FALSE;
 }
 
 list($orig_width, $orig_height, $type) = getimagesize($original);
 
 $ratio = (($orig_height/$orig_width) - ($height/$width));
 
 $src_x = $src_y = 0;
 
 if ($cut)//裁剪到填满容器
 {
 $new_height = $height;
 $new_width  = $width;
 if ($new_height != $orig_height && $new_width != $orig_width)
 {
 if ($ratio < 0)
 {
 
 $real_height = $orig_height;
 $real_width  = ceil($width*$orig_height/$height);
 
 $src_x = floor(($orig_width-$real_width)/2);
 }
 else 
 {
 
 $real_width  = $orig_width;
 $real_height = ceil($height*$orig_width/$width);
 
 $src_y = floor(($orig_height-$real_height)/2);
 }
 }
 }
 else
 {
 $real_width  = $orig_width;
 $real_height = $orig_height;
 
 if($ratio > 0)
 {
 $new_height = $height;
 $new_width  = ceil($orig_width*$height/$orig_height);
 }
 else
 {
 $new_width = $width;
 $new_height = ceil($orig_height*$width/$orig_width);
 }
 }
 
 switch ($type) {
 case 1:
 if (function_exists("imagecreatefromgif"))
 {
 $src_image = imagecreatefromgif($orig_width);
 }
 break;
 
 case 2:
 if (function_exists("imagecreatefromjpeg")) {
 $src_image = imagecreatefromjpeg($original);
 }
 break;
 
 case 3:
 if (function_exists("imagecreatefrompng")) {
 $src_image = imagecreatefrompng($original);
 }             
 break;
 }
 
 if (!$src_image) return FALSE;
 
 if (function_exists("imagecreatetruecolor"))
 {
 $dst_image = imagecreatetruecolor($new_width, $new_height);
 $copy    = 'imagecopyresampled';
 }
 else 
 {
 $dst_image = imagecreate($new_width, $new_height);
 $copy    = 'imagecopyresized';
 }
 
 
 if ($type == 3) // png we can actually preserve transparency
 {
 imagealphablending($dst_image, FALSE);
 imagesavealpha($dst_image, TRUE);
 }
 
 $copy($dst_image, $src_image, 0, 0, $src_x, $src_y, $new_width, $new_height, $real_width, $real_height);
 
 switch ($type) {
 case 1:
 if (!function_exists("imagegif")) {
 return FALSE;
 }
 @imagegif($dst_image, $original);
 break;
 
 case 2:
 if (!function_exists("imagejpeg"))
 {
 return FALSE;
 }
 @imagejpeg($dst_image, $original);
 break;
 
 case 3:
 if (!function_exists("imagepng"))
 {
 return FALSE;
 }
 @imagepng($dst_image, $original);
 break;
 }
 
 //  Kill the file handles
 imagedestroy($dst_image);
 imagedestroy($src_image);

 // Set the file to 777
 @chmod($original, 0666);
 
 return TRUE;
}

本文出自 肥蕉博客@IT技术,热门话题,生活随笔,美图欣赏,转载时请注明出处及相应链接。

本文永久链接: http://www.bananawolf.com/html/2011/10/772.html

12条评论

  1. iPad控 十一月 8, 2011 1:27 下午 回复

    php的天下。。。。。。。学习了

  2. 药油 十一月 22, 2011 2:37 下午 回复

    呵!分享分享咯。。

  3. 瑶药 十一月 23, 2011 1:27 下午 回复

    哇哇,不太懂啊…

  4. 微魔部落,VPS优惠信息 十二月 17, 2011 3:40 下午 回复

    飘过,学习了~

  5. 义乌seo 一月 10, 2012 12:41 下午 回复

    路过,正好学习这招

  6. 五月 26, 2012 2:08 下午 回复

    请把这个完整代码发一下给我,谢谢!

  7. ppin0 六月 2, 2012 3:30 下午 回复

    哇哇,不太懂啊…

  8. icyboy 一月 16, 2013 9:20 下午 回复

    你好,能否提供下完整的代码,谢谢

    1. jaclon 一月 18, 2013 12:51 下午 回复

      已邮件回复,请注意查收

  9. William 三月 26, 2013 9:24 上午 回复

    你好,能否提供下完整的代码,谢谢

    1. jaclon 三月 28, 2013 1:44 下午 回复

      这个函数已经可以直接使用了

  10. vivian 十月 24, 2013 4:52 上午 回复

    你好,很不错的code,但是我根自己的情况结合起来的话有些不明白!你方便教导一下么

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

Ɣ回顶部