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是否成功的代码分享
Jan 24 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
Nov 03 PHP
PHP微信支付开发实例
Jun 22 PHP
php array_multisort 对数组进行排序详解及实例代码
Oct 27 PHP
PHPCMS忘记后台密码的解决办法
Oct 30 PHP
php Session无效分析资料整理
Nov 29 PHP
php 生成加密公钥加密私钥实例详解
Jun 16 PHP
PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
Jun 21 PHP
简单实现php上传文件功能
Sep 21 PHP
php获取ajax的headers方法与内容实例
Dec 27 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
Jan 15 PHP
laravel-admin自动生成模块,及相关基础配置方法
Oct 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
如何在PHP中使用Oracle数据库(4)
2006/10/09 PHP
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
2007/02/22 PHP
php strrpos()与strripos()函数
2013/08/31 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
2014/08/14 PHP
php备份数据库类分享
2015/04/14 PHP
Mootools 1.2教程(2) DOM选择器
2009/09/14 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
初始Nodejs
2014/11/08 NodeJs
js获取内联样式的方法
2015/01/27 Javascript
jQuery插件ajaxFileUpload实现异步上传文件效果
2015/04/14 Javascript
javascript常用函数(2)
2015/11/05 Javascript
js图片轮播手动切换效果
2015/11/10 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
2017/04/25 jQuery
VUE+node(express)实现前后端分离
2019/10/13 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
在Django框架中运行Python应用全攻略
2015/07/17 Python
详解Python Socket网络编程
2016/01/05 Python
Python通过for循环理解迭代器和生成器实例详解
2019/02/16 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
python cumsum函数的具体使用
2019/07/29 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
C#笔试题集合
2013/06/21 面试题
个性大学生自我评价
2013/12/04 职场文书
给公司的建议书范文
2014/05/13 职场文书
年度评优评先方案
2014/06/03 职场文书
小学竞选班长演讲稿
2014/09/09 职场文书
网络工程专业大学生求职信
2014/10/01 职场文书
违章停车检讨书
2014/10/21 职场文书
介绍信的格式
2015/01/30 职场文书
个人年度总结报告
2015/03/09 职场文书
独生子女证明范本
2015/06/19 职场文书
告诉你创业计划书的8个实用技巧
2019/07/12 职场文书
小程序自定义轮播图圆点组件
2022/06/25 Javascript