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伪静态之APACHE篇
Jun 02 PHP
destoon公司主页模板风格的添加方法
Jun 20 PHP
9条PHP编程小知识及易犯的小错误
Jan 22 PHP
PHP性能分析工具XHProf安装使用教程
May 13 PHP
WordPress中用于创建以及获取侧边栏的PHP函数讲解
Dec 29 PHP
如何使用PHP给图片加水印
Oct 12 PHP
PHP设计模式之工厂模式详解
Oct 24 PHP
原生php实现excel文件读写的方法分析
Apr 25 PHP
PHP共享内存使用与信号控制实例分析
May 09 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
Feb 20 PHP
ThinkPHP5框架中使用JWT的方法示例
Jun 03 PHP
Laravel中如何轻松容易的输出完整的SQL语句
Jul 26 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
调试一段PHP程序时遇到的三个问题
2012/01/17 PHP
在smarty中调用php内置函数的方法
2013/02/07 PHP
PHP图片库imagemagick安装方法
2014/09/23 PHP
jquery选择器原理介绍($()使用方法)
2014/03/25 Javascript
轻松创建nodejs服务器(7):阻塞操作的实现
2014/12/18 NodeJs
js 获取元素在页面上的偏移量的方法汇总
2015/04/13 Javascript
Immutable 在 JavaScript 中的应用
2016/05/02 Javascript
vue-ajax小封装实例
2017/09/18 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
2019/05/28 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
jquery实现简单拖拽效果
2020/07/20 jQuery
python使用pyhook监控键盘并实现切换歌曲的功能
2014/07/18 Python
Python批量按比例缩小图片脚本分享
2015/05/21 Python
Python实现的下载网页源码功能示例
2017/06/13 Python
用python脚本24小时刷浏览器的访问量方法
2018/12/07 Python
Python 多维List创建的问题小结
2019/01/18 Python
详解Python中的内建函数,可迭代对象,迭代器
2019/04/29 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
安装PyInstaller失败问题解决
2019/12/14 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
django queryset相加和筛选教程
2020/05/18 Python
Python包和模块的分发详细介绍
2020/06/19 Python
Python执行时间的几种计算方法
2020/07/31 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
解释i节点在文件系统中的作用
2013/11/26 面试题
大学生个人求职信范文
2013/09/21 职场文书
高中军训感想300字
2014/03/04 职场文书
酒店员工培训方案
2014/06/02 职场文书
社区护士演讲稿
2014/08/27 职场文书
国土资源局开展党的群众路线教育实践活动整改措施
2014/09/26 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
党的群众路线教育实践活动督导组工作情况汇报
2014/10/28 职场文书
创先争优承诺书
2015/01/20 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
MySQL创建表操作命令分享
2022/03/25 MySQL