PHP实现的自定义图像居中裁剪函数示例【测试可用】


Posted in PHP onAugust 11, 2017

本文实例讲述了PHP实现的自定义图像居中裁剪函数。分享给大家供大家参考,具体如下:

图像居中裁减的大致思路:

1.首先将图像进行缩放,使得缩放后的图像能够恰好覆盖裁减区域。(imagecopyresampled — 重采样拷贝部分图像并调整大小)

2.将缩放后的图像放置在裁减区域中间。(imagecopy — 拷贝图像的一部分)

3.裁减图像并保存。(imagejpeg | imagepng | imagegif — 输出图象到浏览器或文件)

具体代码:

//==================缩放裁剪函数====================
/**
 * 居中裁剪图片
 * @param string $source [原图路径]
 * @param int $width [设置宽度]
 * @param int $height [设置高度]
 * @param string $target [目标路径]
 * @return bool [裁剪结果]
 */
function image_center_crop($source, $width, $height, $target)
{
  if (!file_exists($source)) return false;
  /* 根据类型载入图像 */
  switch (exif_imagetype($source)) {
    case IMAGETYPE_JPEG:
      $image = imagecreatefromjpeg($source);
      break;
    case IMAGETYPE_PNG:
      $image = imagecreatefrompng($source);
      break;
    case IMAGETYPE_GIF:
      $image = imagecreatefromgif($source);
      break;
  }
  if (!isset($image)) return false;
  /* 获取图像尺寸信息 */
  $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)) {
    case IMAGETYPE_JPEG:
      imagejpeg($target_img, $target);
      break;
    case IMAGETYPE_PNG:
      imagepng($target_img, $target);
      break;
    case IMAGETYPE_GIF:
      imagegif($target_img, $target);
      break;
  }
//  return boolval(file_exists($target));//PHP5.5以上可用boolval()函数获取返回的布尔值
  return file_exists($target)?true:false;//兼容低版本PHP写法
}
//==================函数使用方式====================
// 原始图片的路径
$source = '../source/img/middle.jpg';
$width = 480; // 裁剪后的宽度
$height = 480;// 裁剪后的高度
// 裁剪后的图片存放目录
$target = '../source/temp/resize.jpg';
// 裁剪后保存到目标文件夹
if (image_center_crop($source, $width, $height, $target)) {
  echo "原图1440*900为:<img src='$source'>";
  echo "<hr>";
    echo "修改后图片480*480为:<img src='$target'>";
}

运行效果:

原图1440*900为:PHP实现的自定义图像居中裁剪函数示例【测试可用】


修改后图片480*480为:PHP实现的自定义图像居中裁剪函数示例【测试可用】

同理,480*320,、800*600等尺寸的图片只需修改相应参数即可。

附:代码测试中遇到的问题

报错: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;
PHP 相关文章推荐
PHP中调用JAVA
Oct 09 PHP
社区(php&amp;&amp;mysql)四
Oct 09 PHP
php 随机生成10位字符代码
Mar 26 PHP
第三章 php操作符与控制结构代码
Dec 30 PHP
php实现的常见排序算法汇总
Sep 08 PHP
PHP简单处理表单输入的特殊字符的方法
Feb 03 PHP
thinkphp利用模型通用数据编辑添加和删除的实例代码
Nov 20 PHP
PHP实现的最大正向匹配算法示例
Dec 19 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
Jul 21 PHP
PDO实现学生管理系统
Mar 21 PHP
PHP基于进程控制函数实现多线程
Dec 09 PHP
Redis在Laravel项目中的应用实例详解
Aug 11 #PHP
PHP验证码无法显示的原因及解决办法
Aug 11 #PHP
php readfile()修改文件上传大小设置
Aug 11 #PHP
浅谈Laravel中的一个后期静态绑定
Aug 11 #PHP
浅谈PHP中new self()和new static()的区别
Aug 11 #PHP
php使用 readfile() 函数设置文件大小大小的方法
Aug 11 #PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
Aug 10 #PHP
You might like
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
php-fpm添加service服务的例子
2018/04/27 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
JQuery设置文本框和密码框得到焦点时的样式
2013/08/30 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
原生js实现水平方向无缝滚动
2017/01/10 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
Vue 仿QQ左滑删除组件功能
2018/03/12 Javascript
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
nodejs搭建本地服务器并访问文件操作示例
2019/05/11 NodeJs
JavaScript RegExp 对象用法详解
2019/09/24 Javascript
微信小程序云函数添加数据到数据库的方法
2020/03/04 Javascript
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
Python实现从订阅源下载图片的方法
2015/03/11 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
python多进程读图提取特征存npy
2019/05/21 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
python conda操作方法
2019/09/11 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
PyTorch中permute的用法详解
2019/12/30 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
Python模块常用四种安装方式
2020/10/20 Python
美国顶尖折扣时尚购物网:Bluefly
2016/08/28 全球购物
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
小学亲子活动总结
2014/07/01 职场文书
教师节座谈会主持词
2015/07/03 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书
Go并发4种方法简明讲解
2022/04/06 Golang
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python