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 相关文章推荐
apache+php+mysql安装配置方法小结
Aug 01 PHP
ueditor 1.2.6 使用方法说明
Jul 24 PHP
php数据类型判断函数有哪些
Sep 23 PHP
thinkphp的c方法使用示例
Feb 24 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
Jul 24 PHP
PHP合并静态文件详解
Nov 14 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
laravel 5.3中自定义加密服务的方案详解
May 09 PHP
php实现的双色球算法示例
Jun 20 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
Aug 15 PHP
PHP Swoole异步MySQL客户端实现方法示例
Oct 24 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
缅甸的咖啡简史
2021/03/04 咖啡文化
Linux下将excel数据导入到mssql数据库中的方法
2010/02/08 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
php+mysql实现简单登录注册修改密码网页
2016/11/30 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
2019/06/22 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
替代window.event.srcElement效果的可兼容性的函数
2009/12/18 Javascript
javascript Object与Function使用
2010/01/11 Javascript
JQuery autocomplete 使用手册
2010/04/01 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
jQuery Ajax中的事件详细介绍
2015/04/16 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
bootstrap快速制作后台界面
2016/12/05 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
Vue AST源码解析第一篇
2017/07/19 Javascript
JSON基本语法及与JavaScript的异同实例分析
2019/01/04 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
详解vue-router的Import异步加载模块问题的解决方案
2020/05/13 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
python比较两个列表是否相等的方法
2015/07/28 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
Python简单实现区域生长方式
2020/01/16 Python
python实现图片素描效果
2020/09/26 Python
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
Mountain Warehouse德国官网:英国户外零售商
2019/08/11 全球购物
精细化工应届生求职信
2013/11/17 职场文书
酒店七夕情人节活动策划方案
2014/08/24 职场文书
法律意见书范本
2015/06/04 职场文书
投资入股协议书
2016/03/22 职场文书
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL