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 相关文章推荐
PHP4在Windows2000下的安装
Oct 09 PHP
php Hex RGB颜色值互换的使用
May 10 PHP
PHP mysql与mysqli事务使用说明 分享
Aug 17 PHP
PHP定时更新程序设计思路分享
Jun 10 PHP
php+mysql大量用户登录解决方案分析
Dec 29 PHP
php抽象类使用要点与注意事项分析
Feb 09 PHP
cakephp打印sql语句的方法
Feb 13 PHP
php实现微信公众平台账号自定义菜单类
Oct 11 PHP
Yii2下点击验证码的切换实例代码
Mar 14 PHP
Laravel timestamps 设置为unix时间戳的方法
Oct 11 PHP
Laravel解决nesting level错误和隐藏index.php的问题
Oct 12 PHP
PHP扩展安装方法步骤解析
Nov 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
PHP与C#分别格式化文件大小的代码
2011/05/14 PHP
第4章 数据处理-php数组的处理-郑阿奇
2011/07/04 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
memcache一致性hash的php实现方法
2015/03/05 PHP
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
PHP利用imagick生成组合缩略图
2016/02/19 PHP
基于thinkPHP类的插入数据库操作功能示例
2017/01/06 PHP
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
javascript的回调函数应用示例
2014/02/20 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
浅谈js中调用函数时加不加括号的问题
2016/07/28 Javascript
详解能在多种前端框架下使用的表格控件
2017/01/11 Javascript
jQuery实现腾讯信用界面(自制刻度尺)样式
2017/08/15 jQuery
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
[46:37]LGD vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python基于正则表达式实现检查文件内容的方法【文件检索】
2017/08/30 Python
Opencv实现抠图背景图替换功能
2019/05/21 Python
使用python模拟命令行终端的示例
2019/08/13 Python
Python类中的魔法方法之 __slots__原理解析
2019/08/26 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
python读取xml文件方法解析
2020/08/04 Python
纯css3制作网站后台管理面板
2014/12/30 HTML / CSS
三维科技面试题
2013/07/27 面试题
工程师求职简历的自我评价分享
2013/10/10 职场文书
应届生自我鉴定
2013/12/11 职场文书
函授大学生自我鉴定
2014/02/05 职场文书
秦兵马俑教学反思
2014/02/07 职场文书
精彩的演讲稿开头
2014/05/08 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
烈士陵园扫墓感想
2015/08/07 职场文书
超市店长竞聘书
2015/09/15 职场文书
优秀范文:读《红岩》有感3篇
2019/10/14 职场文书
Html5大屏数据可视化开发的实现
2021/06/11 HTML / CSS
Linux中文件的基本属性介绍
2022/06/01 Servers