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中10个不常见却非常有用的函数
Mar 21 PHP
php入门学习知识点五 关于php数组的几个基本操作
Jul 14 PHP
zf框架db类的分页示例分享
Mar 14 PHP
50个PHP程序性能优化的方法
Jun 02 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
Aug 19 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
Dec 16 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
Apr 21 PHP
详解php的socket通信
Aug 11 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
Jan 07 PHP
php用正则判断是否为数字的方法
Mar 25 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
Jul 25 PHP
浅谈PHP匿名函数和闭包
Mar 08 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
神族 Protoss 剧情介绍
2020/03/14 星际争霸
关于PHP中的Class的几点个人看法
2006/10/09 PHP
php session应用实例 登录验证
2009/03/16 PHP
php文件下载处理方法分析
2015/04/22 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
2015/11/10 PHP
php获取一定范围内取N个不重复的随机数
2016/05/28 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
PHP正则表达式函数preg_replace用法实例分析
2020/06/04 PHP
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
Jquery实现遮罩层的简单实例(就是弹出DIV周围都灰色不能操作)
2016/07/14 Javascript
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
微信小程序实现YDUI的ScrollNav组件
2018/02/02 Javascript
React实现轮播效果
2020/08/25 Javascript
Map与WeakMap类型在JavaScript中的使用详解
2020/11/18 Javascript
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
python简单文本处理的方法
2015/07/10 Python
python获取list下标及其值的简单方法
2016/09/12 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
Python中字典与恒等运算符的用法分析
2019/08/22 Python
python构造函数init实例方法解析
2020/01/19 Python
python从PDF中提取数据的示例
2020/10/30 Python
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
中专毕业自我鉴定
2013/10/16 职场文书
幼儿园中秋节活动方案
2014/02/06 职场文书
大学校务公开实施方案
2014/03/31 职场文书
民主生活会对照检查材料
2014/09/22 职场文书
音乐课外活动总结
2015/05/09 职场文书
单位计划生育责任书
2015/05/09 职场文书
交通事故被告答辩状
2015/05/22 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书
董事长助理工作总结2015
2015/07/23 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python
教你怎么用Python监控愉客行车程
2021/04/29 Python