PHP自动生成缩略图函数的源码示例


Posted in PHP onMarch 18, 2019

一个简单但功能比较完善的自动生成缩略图的函数,可以按需要对图片进行缩放、裁切、锁定宽或高、使用空白填充

以下为源码,比较简单,相信很容易看明白,记得打开 GD 库的支持哦:

<?php
/**
 * 生成缩略图
 * @param string   源图绝对完整地址{带文件名及后缀名}
 * @param string   目标图绝对完整地址{带文件名及后缀名}
 * @param int    缩略图宽{值设为0时目标高度不能为0,目标宽度为源图宽*(目标高度/源图高)}
 * @param int    缩略图高{值设为0时目标宽度不能为0,目标高度为源图高*(目标宽度/源图宽)}
 * @param int    是否裁切{宽,高必须非0}
 * @param int/float 缩放{0:不缩放, 0<this<1:缩放到相应比例(此时宽高限制和裁切均失效)}
 * @return boolean
 */
function img2thumb($src_img, $dst_img, $width = 75, $height = 75, $cut = 0, $proportion = 0)
{
  if(!is_file($src_img))
  {
    return false;
  }
  $ot = fileext($dst_img);
  $otfunc = 'image' . ($ot == 'jpg' ? 'jpeg' : $ot);
  $srcinfo = getimagesize($src_img);
  $src_w = $srcinfo[0];
  $src_h = $srcinfo[1];
  $type = strtolower(substr(image_type_to_extension($srcinfo[2]), 1));
  $createfun = 'imagecreatefrom' . ($type == 'jpg' ? 'jpeg' : $type);
  $dst_h = $height;
  $dst_w = $width;
  $x = $y = 0;
  /**
   * 缩略图不超过源图尺寸(前提是宽或高只有一个)
   */
  if(($width> $src_w && $height> $src_h) || ($height> $src_h && $width == 0) || ($width> $src_w && $height == 0))
  {
    $proportion = 1;
  }
  if($width> $src_w)
  {
    $dst_w = $width = $src_w;
  }
  if($height> $src_h)
  {
    $dst_h = $height = $src_h;
  }
  if(!$width && !$height && !$proportion)
  {
    return false;
  }
  if(!$proportion)
  {
    if($cut == 0)
    {
      if($dst_w && $dst_h)
      {
        if($dst_w/$src_w> $dst_h/$src_h)
        {
          $dst_w = $src_w * ($dst_h / $src_h);
          $x = 0 - ($dst_w - $width) / 2;
        }
        else
        {
          $dst_h = $src_h * ($dst_w / $src_w);
          $y = 0 - ($dst_h - $height) / 2;
        }
      }
      else if($dst_w xor $dst_h)
      {
        if($dst_w && !$dst_h) //有宽无高
        {
          $propor = $dst_w / $src_w;
          $height = $dst_h = $src_h * $propor;
        }
        else if(!$dst_w && $dst_h) //有高无宽
        {
          $propor = $dst_h / $src_h;
          $width = $dst_w = $src_w * $propor;
        }
      }
    }
    else
    {
      if(!$dst_h) //裁剪时无高
      {
        $height = $dst_h = $dst_w;
      }
      if(!$dst_w) //裁剪时无宽
      {
        $width = $dst_w = $dst_h;
      }
      $propor = min(max($dst_w / $src_w, $dst_h / $src_h), 1);
      $dst_w = (int)round($src_w * $propor);
      $dst_h = (int)round($src_h * $propor);
      $x = ($width - $dst_w) / 2;
      $y = ($height - $dst_h) / 2;
    }
  }
  else
  {
    $proportion = min($proportion, 1);
    $height = $dst_h = $src_h * $proportion;
    $width = $dst_w = $src_w * $proportion;
  }
  $src = $createfun($src_img);
  $dst = imagecreatetruecolor($width ? $width : $dst_w, $height ? $height : $dst_h);
  $white = imagecolorallocate($dst, 255, 255, 255);
  imagefill($dst, 0, 0, $white);
  if(function_exists('imagecopyresampled'))
  {
    imagecopyresampled($dst, $src, $x, $y, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
  }
  else
  {
    imagecopyresized($dst, $src, $x, $y, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
  }
  $otfunc($dst, $dst_img);
  imagedestroy($dst);
  imagedestroy($src);
  return true;
}
function fileext($file)
{
  return pathinfo($file, PATHINFO_EXTENSION);
}
?>

使用示例:

<?php
$src_img = "./test.jpg"; //原图片完整路径和名称,带图片扩展名
$dst_img = "./test_thumb.jpg"; //生成的缩略图存放的完整路径和名称
/* 生成宽300px,高200px的缩略图,不进行裁切,空白部分将会使用背景色填充 */
$stat = img2thumb($src_img, $dst_img, $width = 300, $height = 200, $cut = 0, $proportion = 0);
if($stat){
  echo 'Resize Image Success!<br />';
  echo '<img src="'.$dst_img.'" />';  
}else{
  echo 'Resize Image Fail!'; 
}
?>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
超级简单的php+mysql留言本源码
Nov 11 PHP
windows下升级PHP到5.3.3的过程及注意事项
Oct 12 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
Jan 10 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
Jun 07 PHP
浅谈PHP正则中的捕获组与非捕获组
Jul 18 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
Apr 26 PHP
PHP提取字符串中的手机号正则表达式怎么写
Jul 17 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
利用PHP获取汉字首字母并且分组排序详解
Oct 22 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
May 31 PHP
php实现将数据做成json的格式给前端使用
Aug 21 PHP
PHP实现简单的计算器
Aug 28 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
Mar 18 #PHP
PHP实现对数字分隔加千分号的方法
Mar 18 #PHP
PHP生成指定范围内的N个不重复的随机数
Mar 18 #PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 #PHP
PHP将整数数字转换为罗马数字实例分享
Mar 17 #PHP
PHP标准库(PHP SPL)详解
Mar 16 #PHP
PHP PDO数据库操作预处理与注意事项
Mar 16 #PHP
You might like
PHP 解决utf-8和gb2312编码转换问题
2010/03/18 PHP
php 数组排序 array_multisort与uasort的区别
2011/03/24 PHP
php根据分类合并数组的方法实例详解
2013/11/06 PHP
php数组合并的二种方法
2014/03/21 PHP
php中in_array函数用法分析
2014/11/15 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
thinkphp集成前端脚手架Vue-cli的教程图解
2018/08/30 PHP
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
ExtJs使用IFrame的实现代码
2010/03/24 Javascript
jQuery中delegate与on的用法与区别示例介绍
2013/12/20 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
AngularJs验证重复密码的方法(两种)
2016/11/25 Javascript
微信小程序 数据遍历的实现
2017/04/05 Javascript
layui之select的option叠加问题的解决方法
2018/03/08 Javascript
javascript+HTML5 canvas绘制时钟功能示例
2019/05/15 Javascript
[01:35]2014DOTA2西雅图邀请赛 专访狐狸妈青春献给刀塔
2014/07/08 DOTA
[01:06]欢迎来到上海,TI9
2018/08/26 DOTA
python操作MySQL数据库的方法分享
2012/05/29 Python
python利用hook技术破解https的实例代码
2013/03/25 Python
Python中的作用域规则详解
2015/01/30 Python
django框架如何集成celery进行开发
2017/05/24 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
2019/07/08 Python
详解Python并发编程之创建多线程的几种方法
2019/08/23 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
Carter’s官方旗舰店:美国受欢迎的婴童服装品牌
2018/01/21 全球购物
独特的礼品和创新的科技产品:The Grommet
2018/02/24 全球购物
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
企业安全标语
2014/06/07 职场文书
三月雷锋月活动总结
2014/07/03 职场文书
退休欢送会致辞
2015/07/31 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
总结几个非常实用的Python库
2021/06/26 Python