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 相关文章推荐
windows xp下安装pear
Dec 02 PHP
解析php中const与define的应用区别
Jun 18 PHP
解析PHP中常见的mongodb查询操作
Jun 20 PHP
解析PHP中intval()等int转换时的意外异常情况
Jun 21 PHP
php 模拟post_验证页面的返回状态(实例讲解)
Oct 28 PHP
PHP临时文件的安全性分析
Jul 04 PHP
PHP响应post请求上传文件的方法
Dec 17 PHP
让你的PHP7更快之Hugepage用法分析
May 31 PHP
PHP微信开发之文本自动回复
Jun 23 PHP
PHP生成图像验证码的方法小结(2种方法)
Jul 18 PHP
替换php字符串中的单引号为双引号的方法
Feb 16 PHP
如何用PHP websocket实现网页实时聊天
May 26 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
实用函数3
2007/11/08 PHP
浅析php header 跳转
2013/06/17 PHP
php基于Snoopy解析网页html的方法
2015/07/09 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
2019/05/25 PHP
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
Jquery 表单验证类介绍与实例
2013/06/09 Javascript
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
2015/11/05 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
vue与vue-i18n结合实现后台数据的多语言切换方法
2018/03/08 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
2019/10/11 Javascript
JS错误处理与调试操作实例分析
2020/04/13 Javascript
使用CodeMirror实现Python3在线编辑器的示例代码
2019/01/14 Python
python基于Selenium的web自动化框架
2019/07/14 Python
HTML5等待加载动画效果
2017/07/27 HTML / CSS
HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
2013/01/30 HTML / CSS
HTML5 虚拟键盘出现挡住输入框的解决办法
2017/02/14 HTML / CSS
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
绩效专员岗位职责
2013/12/02 职场文书
中文专业学生自我评价范文
2014/02/06 职场文书
消防安全汇报材料
2014/02/08 职场文书
元宵晚会主持词
2014/03/25 职场文书
学习型班组申报材料
2014/05/31 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
原生JS实现飞机大战小游戏
2021/06/09 Javascript
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python