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中使用与Perl兼容的正则表达式
Nov 26 PHP
php Smarty 字符比较代码
Feb 27 PHP
WordPress判断用户是否登录的代码
Mar 17 PHP
php判断变量类型常用方法
Apr 24 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
Dec 29 PHP
解析php中heredoc的使用方法
Jun 17 PHP
保存到桌面、设为桌面且带图标的PHP代码
Nov 19 PHP
php中cookie实现二级域名可访问操作的方法
Nov 11 PHP
PHP中shuffle数组值随便排序函数用法
Nov 21 PHP
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
Oct 13 PHP
PHP命令Command模式用法实例分析
Aug 08 PHP
PHP strripos函数用法总结
Feb 11 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中使用Oracle数据库(5)
2006/10/09 PHP
PHP详解ASCII码对照表与字符转换
2011/12/05 PHP
PHP错误WARNING: SESSION_START() [FUNCTION.SESSION-START]解决方法
2014/05/04 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
Google韩国首页图标动画效果
2007/08/26 Javascript
JavaScript delete操作符应用实例
2009/01/13 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
2011/05/09 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
2013/01/23 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
2015/03/03 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
JavaScript数组去重的几种方法效率测试
2016/10/23 Javascript
理解javascript中的闭包
2017/01/11 Javascript
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
基于vue2实现左滑删除功能
2017/11/28 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
浅谈FastClick 填坑及源码解析
2018/03/02 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
[55:03]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.20
2020/11/20 DOTA
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
详谈Python基础之内置函数和递归
2017/06/21 Python
基于Python正确读取资源文件
2020/09/14 Python
python IP地址转整数
2020/11/20 Python
HTML5实现无刷新修改URL的方法
2019/11/14 HTML / CSS
韩国休闲女装品牌网站:ANAIS
2016/08/24 全球购物
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
写给女朋友的道歉信
2014/01/12 职场文书
财务支持类个人的自我评价
2014/02/14 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书
详解Vue的sync修饰符
2021/05/15 Vue.js
详解SQL的窗口函数
2022/04/21 Oracle