PHP 实现的自定义图像居中裁剪函数示例
图像居中裁减的大致思路:
1. 首先将图像进行缩放, 使得缩放后的图像能够恰好覆盖裁减区域.(imagecopyresampled 重采样拷贝部分图像并调整大小)
2. 将缩放后的图像放置在裁减区域中间.(imagecopy 拷贝图像的一部分)
3. 裁减图像并保存.(imagejpeg | imagepng | imagegif 输出图象到浏览器或文件)
具体代码:<?php
//================== 缩放裁剪函数 ====================
/**
* 居中裁剪图片
* @param string $source [原图路径]
* @param int $width [设置宽度]
* @param int $height [设置高度]
* @param string $target [目标路径]
* @return bool [裁剪结果]
*/
functionimage_center_crop($source,$width,$height,$target)
{
if(!file_exists($source))returnfalse;
/* 根据类型载入图像 */
switch(exif_imagetype($source)){
caseIMAGETYPE_JPEG:
$image=imagecreatefromjpeg($source);
break;
caseIMAGETYPE_PNG:
$image=imagecreatefrompng($source);
break;
caseIMAGETYPE_GIF:
$image=imagecreatefromgif($source);
break;
}
if(!isset($image))returnfalse;
/* 获取图像尺寸信息 */
$target_w=$width;
$target_h=$height;
$source_w=imagesx($image);
$source_h=imagesy($image);
/* 计算裁剪宽度和高度 */
$judge=(($source_w/$source_h)>($target_w/$target_h));
$resize_w=$judge?($source_w*$target_h)/$source_h:$target_w;
$resize_h=!$judge?($source_h*$target_w)/$source_w:$target_h;
$start_x=$judge?($resize_w-$target_w)/2:0;
$start_y=!$judge?($resize_h-$target_h)/2:0;
/* 绘制居中缩放图像 */
$resize_img=imagecreatetruecolor($resize_w,$resize_h);
imagecopyresampled($resize_img,$image,0,0,0,0,$resize_w,$resize_h,$source_w,$source_h);
$target_img=imagecreatetruecolor($target_w,$target_h);
imagecopy($target_img,$resize_img,0,0,$start_x,$start_y,$resize_w,$resize_h);
/* 将图片保存至文件 */
if(!file_exists(dirname($target)))mkdir(dirname($target),0777,true);
switch(exif_imagetype($source)){
caseIMAGETYPE_JPEG:
imagejpeg($target_img,$target);
break;
caseIMAGETYPE_PNG:
imagepng($target_img,$target);
break;
caseIMAGETYPE_GIF:
imagegif($target_img,$target);
break;
}
// return boolval(file_exists($target));//PHP5.5 以上可用 boolval() 函数获取返回的布尔值
returnfile_exists($target)?true:false;// 兼容低版本 PHP 写法
}
//================== 函数使用方式 ====================
// 原始图片的路径
$source='photoClip.jpg';
$width=480;// 裁剪后的宽度
$height=480;// 裁剪后的高度
// 裁剪后的图片存放目录
$target='dd111.jpg';
// 裁剪后保存到目标文件夹
if(image_center_crop($source,$width,$height,$target)){
echo"原图 1440*900 为:";
echo"
";
echo"修改后图片 480*480 为:";
}
附: 代码测试中遇到的问题
报错: call an undefined function exif_imagetype()
解决方法:
打开扩展
extension=php_exif.dll
并将
extension=php_mbstring.dll
, 放到
extension=php_exif.dll
前边
另: boolval() 函数为 PHP5.5 版本以上才能使用的函数, 本文测试代码中为兼容低版本, 使用如下语句代替
return file_exists($target)?true:false;
来源: http://www.bubuko.com/infodetail-2555896.html