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模板,主要想体现一下思路
Dec 25 PHP
php下网站防IP攻击代码,超级实用
Oct 24 PHP
用PHP编写和读取XML的几种方式
Jan 12 PHP
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
Jun 25 PHP
如何在php中正确的使用json
Aug 06 PHP
PHP中鲜为人知的10个函数
Feb 28 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
Jul 22 PHP
通过php修改xml文档内容的方法
Jan 23 PHP
php对文件夹进行相关操作(遍历、计算大小)
Nov 04 PHP
总结PHP中DateTime的常用方法
Aug 11 PHP
PHP基于GD库的图像处理方法小结
Sep 27 PHP
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
Apr 01 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后台程序与Javascript的两种交互方式
2009/10/25 PHP
PHP中header和session_start前不能有输出原因分析
2013/01/11 PHP
PHP小偷程序的设计与实现方法详解
2016/10/15 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
php和nginx交互实例讲解
2019/09/24 PHP
基于php+MySql实现学生信息管理系统实例
2020/08/04 PHP
自动完成JS类(纯JS, Ajax模式)
2009/03/12 Javascript
jQuery 树形结构的选择器
2010/02/15 Javascript
jquery keypress,keyup,onpropertychange键盘事件
2010/06/25 Javascript
js获取select选中的option的text示例代码
2013/12/19 Javascript
javascript控制在光标位置插入文字适合表情的插入
2014/06/09 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
2016/05/05 Javascript
JavaScript简单实现弹出拖拽窗口(二)
2016/06/17 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
2018/05/01 Javascript
JavaScript数组去重的几种方法
2019/04/07 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
2019/06/10 Javascript
java实现单链表增删改查的实例代码详解
2019/08/30 Javascript
javascript+css实现进度条效果
2020/03/25 Javascript
跟老齐学Python之坑爹的字符编码
2014/09/28 Python
python获取各操作系统硬件信息的方法
2015/06/03 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
python批量从es取数据的方法(文档数超过10000)
2018/12/27 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
2020/03/16 Python
基于python实现把json数据转换成Excel表格
2020/05/07 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
毕业自我鉴定总结
2014/03/24 职场文书
董事长助理工作总结2015
2015/07/23 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android