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企业级应用之常见缓存技术篇
Jan 27 PHP
PHP __autoload函数(自动载入类文件)的使用方法
Feb 04 PHP
php截取字符串函数分享
Feb 02 PHP
学习php设计模式 php实现模板方法模式
Dec 08 PHP
PHP异常处理Exception类
Dec 11 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
Feb 27 PHP
php构造函数与析构函数
Apr 23 PHP
php支付宝在线支付接口开发教程
Sep 19 PHP
PHP magento后台无法登录问题解决方法
Nov 24 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
解决php扩展安装不生效问题
Oct 25 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 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数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
php使用cookie实现记住登录状态
2015/04/27 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
2016/02/26 PHP
php 解决substr()截取中文字符乱码问题
2016/07/18 PHP
js中巧用cssText属性批量操作样式
2011/03/13 Javascript
6款新颖的jQuery和CSS3进度条插件推荐
2013/03/05 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
2017/01/06 Javascript
Bootstrap模态框案例解析
2017/03/05 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
React Native时间转换格式工具类分享
2017/10/24 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
记录一篇关于redux-saga的基本使用过程
2018/08/18 Javascript
在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作
2020/08/10 Javascript
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
Python多进程同步简单实现代码
2016/04/27 Python
Python单例模式实例详解
2017/03/01 Python
Python实现的快速排序算法详解
2017/08/01 Python
python制作小说爬虫实录
2017/08/14 Python
python 同时运行多个程序的实例
2019/01/07 Python
Python:slice与indices的用法
2019/11/25 Python
python3 deque 双向队列创建与使用方法分析
2020/03/24 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
next在python中返回迭代器的实例方法
2020/12/15 Python
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
台湾三立电视电商平台:电电购
2019/09/09 全球购物
C++程序员求职信范文
2014/04/14 职场文书
村级换届选举方案
2014/05/10 职场文书
税务会计岗位职责
2015/04/02 职场文书
《LOL》“克隆大作战”久违归来 幻灵战队皮肤上线
2022/04/03 其他游戏