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写的MySQL数据库用户认证系统代码
Mar 22 PHP
php获取中文拼音首字母类和函数分享
Apr 24 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
Oct 23 PHP
php更新mysql后获取改变行数的方法
Dec 25 PHP
PHP加密解密字符串汇总
Apr 26 PHP
php技术实现加载字体并保存成图片
Jul 27 PHP
Symfony查询方法实例小结
Jun 28 PHP
php 删除一维数组中某一个值元素的操作方法
Feb 01 PHP
PHP实现根据数组某个键值大小进行排序的方法
Mar 13 PHP
PHP实现八皇后算法
May 06 PHP
PHP下载文件函数与用法示例
Sep 27 PHP
PHP中国际化的字符串排序和比较对象详解
Aug 23 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
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
2014/09/06 PHP
php程序员应具有的7种能力小结
2014/11/27 PHP
深入浅析用PHP实现MVC
2016/03/02 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
php生出随机字符串
2017/07/06 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
php解决安全问题的方法实例
2019/09/19 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
Javascript alert消息换行的方法
2013/08/07 Javascript
javascript中this的四种用法
2015/05/11 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
2016/06/07 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
2017/04/13 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
Openlayers学习之加载鹰眼控件
2020/09/28 Javascript
vue使用vant中的checkbox实现全选功能
2020/11/17 Vue.js
详解python实现识别手写MNIST数字集的程序
2018/08/03 Python
对python 判断数字是否小于0的方法详解
2019/01/26 Python
8种常用的Python工具
2020/08/05 Python
Django自带的用户验证系统实现
2020/12/18 Python
CSS3实现多背景模拟动态边框的效果
2016/11/08 HTML / CSS
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
临床医学系毕业生推荐信
2013/11/09 职场文书
可贵的沉默教学反思
2014/02/06 职场文书
企业文化口号
2014/06/12 职场文书
文员求职信
2014/07/15 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
采购员岗位职责
2015/02/03 职场文书
中学生打架检讨书之500字
2019/08/06 职场文书
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP
Python学习开发之图形用户界面详解
2021/08/23 Python
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android